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 секунды

Поскольку есть два тестируемых бэкэнда, вы получаете четыре теста, но настройка модуля выполняется только один раз для каждого бэкенда, используемого в модуле.

Другие вопросы по тегам