Есть несколько способов подойти к этому.Тот, который я бы использовал по умолчанию, запускает ваши фиктивные тесты, а затем, когда присутствует флаг командной строки, проверяет и макет и реальную версию.
Итак, сначала самая легкая часть,добавив параметр командной строки:
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
файл действительно.)