Запускать тесты для тестирования нескольких бэкэндов? - PullRequest
0 голосов
/ 04 июня 2018

Я построил серию тестов (с использованием pytest) для кодовой базы, взаимодействующей с Github API (как для ее вызова, так и для получения веб-хуков).

В настоящее время эти тесты выполняются на полусреднем уровне.реалистичный макет github: вызовы github перехватываются через Ответы Sentry и проходят через ложную реализацию github / git (из тех битов, которые мне нужны), с которыми также можно взаимодействовать непосредственно из тестовых случаев.Любой веб-крючок, который должен быть запущен, использует тестовый клиент Werkzeug для обратного вызова в приложение WSGI, используемое в качестве конечной точки веб-крюка.

Это работает хорошо, быстро (достаточно) и отлично подходит по умолчанию, ноЯ хотел бы иметь возможность запускать эти же тесты на самом github, и вот тут я в замешательстве: мне нужно отключить текущие реализации тестируемых систем (прямой доступ «библиотеки» к базе кода и mock github) с помощьюдругие (доступ через API к «внешне» запускаемой базе кода и фактическому github), и я не совсем уверен, как действовать.

Я попытался использовать pytest_generate_tests для переключения реализаций фикстуры (из кодовой базы)& github) через плагин, но я не совсем знаю, сработает ли это, и до сих пор мои попытки загрузить локальный файл как плагин в pytest через pytest -p <package_name> не увенчались большим успехом.

Я хотел бы знать, если я иду в правильном направлении, и в этом случае, если кто-то может помочь с использованием "локальных" плагинов (не устанавливается через Setuptools, а не на основе conftest.py) в pytest.

Не уверен, что это имеет какое-либо значение, но я использую pytest 3.6.0, работающий на CPython 3.6, запросы 2.18.4, ответы 0.9.0 иWerkzeug 0.14.1.

1 Ответ

0 голосов
/ 04 июня 2018

Есть несколько способов подойти к этому.Тот, который я бы использовал по умолчанию, запускает ваши фиктивные тесты, а затем, когда присутствует флаг командной строки, проверяет и макет и реальную версию.

Итак, сначала самая легкая часть,добавив параметр командной строки:

def pytest_addoption(parser):
    parser.addoption('--github', action='store_true',
                 help='Also test against real github')

Теперь это доступно через приспособление pytestconfig как pytestconfig.getoption('github'), часто также косвенно доступное, например, через приспособление запроса как request.config.getoption('github').

Сейчасвам нужно использовать этот параметр для любого теста, который должен взаимодействовать с API github, чтобы они запускались как с макетом, так и с реальным экземпляром.Не зная вашего кода, звучит так, что неплохо было бы использовать клиент Werkzeug: превратить его в фиксатор, а затем его можно параметризировать для возврата как реального клиента, так и тестового клиента, которого вы упомянули:

@pytest.fixture
def werkzeug_client(werkzeug_client_type):
    if werkzeug_client_type == 'real':
        return create_the_real_client()
    else:
        return create_the_mock_client()

def pytest_generate_tests(metafunc):
    if 'werkzeug_client_type' in metafunc.fixturenames:
        types = ['mock']
        if metafunc.config.getoption('github'):
            types.append('real')
        metafunc.parametrize('werkzeug_client_type', types)

Теперьесли вы напишите свой тест в виде:

def test_foo(werkzeug_client):
     assert werkzeug_client.whatever()

Вы получите один тест в обычном режиме и два теста при вызове с pytest --github.

(Помните, что хуки должны быть в файлах conftest.py, покаПриспособления могут быть где угодно. Имейте в виду, что хук pytest_addoption действительно должен использоваться только в файле conftest верхнего уровня, чтобы избежать путаницы относительно того, когда хук используется pytest, а когда нет. Поэтому вы должны поместить весь этот код вна самом деле conftest.py файл действительно.)

...