Код: Выделить всё
from pytest import fixture, skip
@fixture(params=['a', 'b'])
def f1(request):
yield request.param
params = [('a', 1), ('a', 2), ('b', 10), ('b', 20)]
@fixture(params=params, ids=[str(x) for x in params])
def f2(f1, request):
if request.param[0] == f1:
yield request.param[1]
else:
skip('invalid')
def test_foo(f1, f2):
return
, дает:
Код: Выделить всё
a.py::test_foo[a-('a', 1)] PASSED
a.py::test_foo[a-('a', 2)] PASSED
a.py::test_foo[a-('b', 10)] SKIPPED
a.py::test_foo[a-('b', 20)] SKIPPED
a.py::test_foo[b-('a', 1)] SKIPPED
a.py::test_foo[b-('a', 2)] SKIPPED
a.py::test_foo[b-('b', 10)] PASSED
a.py::test_foo[b-('b', 20)] PASSED
- пропущенные варианты вообще не отображались как тестовый пример
- параметризованный идентификатор тестового набора отображается без повторения фикстуры f1. В идеале, как , например a-2, b-10 и т. д.
- в идеале определяется более разумным способом, без повторений
Существует своего рода обходной путь с использованием параметризации:
Код: Выделить всё
@pytest.mark.parametrize(params=('f1,f2', (('a', 1), ('b', 10))))
def test_foo():
return
Код: Выделить всё
@fixture
def f1_1(f1):
return
Альтернатива 2: pytest_generate_tests
https://docs.pytest.org/en/latest/parametrize.html
Код: Выделить всё
f2_vals = {'a': (1,2), 'b': (10,20)}
def pytest_generate_tests(metafunc):
if "f2" in metafunc.fixturenames:
assert "f1" in metafunc.fixturenames
metafunc.parametrize("f2", f2_vals[get_f1_val()])
Альтернатива 3: игнорировать / удалять тестовые примеры
На данный момент запрос функции на https://github.com/pytest-dev/pytest/issues/3730, но решает только часть удаления недопустимых комбинаций тестовых наборов из результатов тестового сеанса.
Подробнее здесь: https://stackoverflow.com/questions/630 ... ther-param
Мобильная версия