conftest.py:
@pytest.fixture(scope='session')
def fw_config(request):
logging.info(f'fw_config called with {request.param}')
return request.param
def pytest_generate_tests(metafunc):
if 'fw_config' in metafunc.fixturenames:
configs_to_test = ['ABC', 'DEF']
pattern = metafunc.definition.get_closest_marker('config_pattern')
if pattern is None:
pattern = '.*'
else:
assert len(pattern.args) == 1
pattern = pattern.args[0]
regex = re.compile(pattern)
configs_to_test = filter(regex.match, configs_to_test)
metafunc.parametrize(argnames='fw_config', argvalues=configs_to_test, ids=configs_to_test, scope='session', indirect=True)
тестовый файл:
class TestGrouping:
@pytest.mark.config_pattern(r'.*ABC.*')
def test_abc(self, fw_config):
time.sleep(4)
return True
@pytest.mark.config_pattern(r'.*DEF.*')
def test_def(self, fw_config):
time.sleep(4)
return True
def test_all(self, fw_config):
time.sleep(4)
return True
Поскольку fw_config имеет сессионную область, я надеюсь, что тесты будут выполняться в следующем порядке:
test_abc [ABC] test_all [ABC] test_def [DEF] test_all [DEF]
И этот fw_config будет вызываться только дважды.
Однако вместо этого они вызываются в следующий порядок:
test_abc [ABC] test_def [DEF] test_all [ABC] test_all [DEF]
и fw_config вызывается четыре раза.
Я пытался почти месяц, чтобы получить это поведение, используя различные методы, и я не смог его достичь.
Я знаю, что я могу просто использовать test_ab c skip (), если fw_config равен 'DEF', но тогда у меня есть пропущенный тест в моем выводе. Я не хочу запускать тест вообще.
fw_config - это замена дорогой конфигурации с именем. Некоторые тесты должны выполняться на всех конфигах, а некоторые тесты должны выполняться только на подмножестве.
Есть ли способ сделать это? Я что-то делаю неправильно?
Я предполагаю, что на самом деле есть три экземпляра создаваемого прибора, и Pytest рассматривает их как полностью разделенные.