Как подключить PyTest к автозаполнению в PyCharm (тип намека)

У меня был медведь времени, выяснив это, и это действительно подслушивало меня, поэтому я подумал, что отправлю это здесь, если кто-то столкнется с той же проблемой...

(и ответ настолько прост, что он болит: -)

Проблема

Ядро проблемы заключается в том, что иногда, не всегда, когда речь идет о светильниках в PyTest, которые возвращают объекты, когда вы используете эти приборы в тесте в PyCharm, вы не получаете подсказок автозаполнения. Если у вас есть объекты с большим количеством методов, которые вы хотите ссылаться при написании теста, это может добавить много накладных расходов и неудобств в процесс написания теста.

Вот простой пример, иллюстрирующий проблему:

Скажем, у меня есть класс "event_manager", который живет в:

location.game.events

Допустим, что в моем файле conftest.py(стандартная вещь PyTest для незнакомого) у меня есть приспособление, которое возвращает экземпляр этого класса:

from location.game.events import event_manager

...

@pytest.fixture(scope="module")
def event_mgr():
    """Creates a new instance of event generate for use in tests"""
    return event_manager()

У меня иногда возникали проблемы (но не всегда - я не могу понять, почему) с такими классами, где автозаполнение не будет работать должным образом в тестовом коде, где я использую прибор, например

def test_tc10657(self, evt_mgr):
    """Generates a Regmod and expects filemod to be searchable on server"""
    evt_mgr.(This does not offer autocomplete hints when you type ".")

Итак, ответ на самом деле довольно прост, как только вы просматриваете тип намека на PyCharm: http://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html

Здесь, как исправить вышеуказанный тестовый код, чтобы автозаполнение работало правильно:

from location.game.events import event_manager 

...

def test_tc10657(self, evt_mgr: event_manager):
    """Generates a Regmod and expects filemod to be searchable on server"""
    evt_mgr.(This DOES offer hints when you type "." Yay!)

Обратите внимание, как я явно ввожу прибор в качестве входного параметра типа event_manager.

Ответ 1

Также, если вы добавите docstring в функцию и укажите тип параметров, вы получите завершение кода для этих параметров.

Например, используя pytest и selenium:

# The remote webdriver seems to be the base class for the other webdrivers
from selenium.webdriver.remote.webdriver import WebDriver

def test_url(url, browser_driver):
    """
    This method is used to see if IBM is in the URL title
    :param  WebDriver browser_driver: The browser driver
    :param str url: the URL to test
    """
    browser_driver.get(url)
    assert "IBM" in browser_driver.title

Здесь также мой файл conftest.py

import pytest
from selenium import webdriver

# Method to handle the command line arguments for pytest
def pytest_addoption(parser):
    parser.addoption("--driver", action="store", default="chrome", help="Type in browser type")
    parser.addoption("--url", action="store", default='https://www.ibm.com', help="url")


@pytest.fixture(scope='module', autouse=True)
def browser_driver(request):
    browser = request.config.getoption("--driver").lower()
    # yield the driver to the specified browser
    if browser == "chrome":
        driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
    else:
        raise Exception("No driver for browser " + browser)
    yield driver
    driver.quit()


@pytest.fixture(scope="module")
def url(request):
    return request.config.getoption("--url")

Протестировано с использованием python 2.7 и Pycharm 2017.1. Формат docstring - reStructuredText, а флажок "Проанализировать код Python в docstrings" проверяется в настройках.