2015-10-28 4 views
2

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

я могу пропустить тесты, добавив следующий код в верхней части тестового модуля:

from json import loads 
import pytest 
@pytest.mark.skipif(pytest.config.getvalue("-k") != "smoke", 
        reason="Smoke tests must be explicitly launched through -k smoke option") 

Тесты не выполняются при выдаче py.test или python -m pytest если опция -k smoke не добавляется.

Я также могу создавать параметризованные тесты из конфигурационных файлов с помощью:

def pytest_generate_tests(metafunc): 
    with open('tests/test_smoke.json','r') as fp: 
     confs = loads(fp.read().decode("utf-8-sig")) 

     for arg in metafunc.funcargnames: 
      if arg == "conf": 
       metafunc.parametrize("conf",confs) 

И пример теста, который параметризованных будет:

def test_that_require_conf(conf): 
    assert not conf 

Проблема заключается в том, что обе вещи не работают хорошо вместе , Тест не пропускается, когда используется pytest_generate_tests. Если я добавлю опцию в pytest_generate_tests во избежание параметризации, то вызов yo pytest не будет выполнен с ошибкой, потому что conf Необходимое оборудование не обязательно test_that_require_conf не может быть найдено.

Любая идея о том, как достичь этого?

ответ

1

Я вижу два варианта: (я предположил, что ваш вариант хранится в smoke)

1) в первом варианте вам нужно изменить pytest_generate_tests. Испытания будут пропущены как один

def pytest_generate_tests(metafunc): 
    for arg in metafunc.funcargnames: 
     if arg == "conf": 
      if metafunc.config.option.keyword != 'smoke': 
       confs = pytest.skip("Smoke tests must....") 
      else: 
       with open('tests/test_smoke.json', 'r') as fp: 
        confs = loads(fp.read().decode("utf-8-sig")) 

      metafunc.parametrize("conf", confs) 

выход будет:

collected 0 items/1 skipped 

==================== 1 skipped in 0.01 seconds ======================== 

2) Вторые варианты будут пропускать любые испытания индивидуально

def test_that_require_conf(request, conf): 
    if request.config.option.smoke != 'smoke': 
     pytest.skip('Smoke tests must....") 
    assert conf 

выход будет

collected 3 items 

tests/test_2.py::test_that_require_conf[1] SKIPPED 
tests/test_2.py::test_that_require_conf[2] SKIPPED 
tests/test_2.py::test_that_require_conf[3] SKIPPED 

====================== 3 skipped in 0.02 seconds ====================== 
Смежные вопросы