В настоящее время я использую следующую комбинацию хитов Pytest для настройки идентификаторов узлов для конкретного модуля:
# In test_module.py
def pytest_generate_tests(metafunc):
if not is_relevant_metafunc(metafunc):
return
args = []
fids = []
for test_class, test_name, test_args in collect_external_tests():
args.append(test_args)
fids.append("Tests.%s.%s" % (test_class, test_name))
metafunc.parametrize(["arg1", "arg2"], args, ids=fids)
# In conftest.py
def pytest_collection_modifyitems(session, config, items):
for item in items:
if not is_relevant_item(item):
continue
item._nodeid = item.callspec.id
item._location = tuple(list(item.location)[:-1] + [item.callspec.id])
Средняя причина этого заключается в том, что я хочу, чтобы параметризованные тесты были разбиты наразличные разделы («классы») в выходном XML-файле JUnit, который затем можно агрегировать и отображать отдельно.
По умолчанию pytest создает следующую иерархию:
root
|_ test_module
|_ test_module.test_func[param_a_1]
|_ test_module.test_func[param_b_2]
|_ ...
|_ test_module.test_func[param_z_36]
хотелось бы иметь что-то похожее на следующую иерархию:
root
|_ test_module
|_ a
|_ test_module.test_func[param_a_1]
|_ ...
|_ test_module.test_func[param_a_25]
|_ b
|_ test_module.test_func[param_b_1]
|_ ...
|_ test_module.test_func[param_b_12]
|_ ...
Есть ли лучший способ сделать это?