pytest - использовать funcargs внутри setup_module
Я включаю в conftetst.py мои собственные параметры командной строки
def pytest_addoption(parser):
parser.addoption("--backend" , default="test_backend",
help="run testx for the given backend, default: test_backend")
а также
def pytest_generate_tests(metafunc):
if 'backend' in metafunc.funcargnames:
if metafunc.config.option.backend:
backend = metafunc.config.option.backend
backend = backend.split(',')
backend = map(lambda x: string.lower(x), backend)
metafunc.parametrize("backend", backend)
Если я использую эту опцию командной строки внутри нормальной функции внутри модуля:
module: test_this.py;
def test_me(backend):
print backend
это работает как ожидалось.
Теперь я хочу включить функцию setup_module для создания / копирования некоторых вещей перед некоторыми тестами:
def setup_module(backend):
import shutil
shutil.copy(backend, 'use_here')
...
к сожалению, у меня теперь есть идея, как получить доступ к этой опции командной строки внутри функции setup_module. Ничего не работает, что я пробовал.
Спасибо за помощь, предложения.
ура
1 ответ
Обсуждается API-расширение, которое позволит использовать funcargs в установочных ресурсах, и ваш пример использования является хорошим примером для этого. Смотрите здесь обсуждаемый проект V2: http://pytest.org/latest/resources.html
Сегодня вы можете решить свою проблему следующим образом:
# contest of conftest.py
import string
def pytest_addoption(parser):
parser.addoption("--backend" , default="test_backend",
help="run testx for the given backend, default: test_backend")
def pytest_generate_tests(metafunc):
if 'backend' in metafunc.funcargnames:
if metafunc.config.option.backend:
backend = metafunc.config.option.backend
backend = backend.split(',')
backend = map(lambda x: string.lower(x), backend)
metafunc.parametrize("backend", backend, indirect=True)
def setupmodule(backend):
print "copying for", backend
def pytest_funcarg__backend(request):
request.cached_setup(setup=lambda: setupmodule(request.param),
extrakey=request.param)
return request.param
Дан тестовый модуль с двумя тестами:
def test_me(backend):
print backend
def test_me2(backend):
print backend
Затем вы можете запустить, чтобы проверить, что все происходит так, как вы ожидаете:
$ py.test -q -s --backend = x, y
собрал 4 элемента для копирования x x.copying для y y.x.y
4 прошло за 0,02 секунды
Поскольку есть два тестируемых бэкэнда, вы получаете четыре теста, но настройка модуля выполняется только один раз для каждого бэкенда, используемого в модуле.