Можно ли выполнить фиксатор финализатора в python только после того, как все параметры теста выполнены?
Я пытаюсь выполнить финализатор после запуска всех параметров моего тестового примера. Проблема в том, что мой финализатор выполняется после каждого запуска параметра, поэтому значения, которые мне нужны, сбрасываются. Пример:
@pytest.mark.parametrize('testcaseid',
['1', '2', '3'])
@pytest.mark.parametrize('lang',
["EN",
"FR"])
def test_lang(self, request, base_url, lang, testcaseid, connect_testrail):
try:
base_url = base_url.replace("english", "french") if lang == "FR" else base_url
self.navigate(base_url)
self.wait_for_page_loaded()
result = self.check_correct_lang_displayed()
assert result
connect_testrail.add_to_result(testcaseid, result="Passed", cmnt=lang)
except Exception as e:
connect_testrail.add_to_result(testcaseid, result="Failed", cmnt=lang + ". Error: " + str(e))
pytest.fail(str(e))
Моя функция add_to_result в отдельном классе выглядит следующим образом:
def add_to_result(self, case_id, result="Untested", cmnt='None'):
self.testcase.setdefault(case_id, [])
self.testcase[case_id].append(result)
self.testcase[case_id].append(cmnt)
мой финализатор демонтажа в файле conftest выглядит так:
@pytest.fixture(scope='function', autouse=True)
def update_test_case_status(request):
logging.info("Starting Test case...")
def update_at_the_end():
logging.info("Ending Test Case...")
results = test_results()
for values in results.itervalues():
if "Failed" in values[0]:
test_rail_conn.update_test_status(test_result="Failed")
break
else:
test_rail_conn.update_test_status(test_result="Passed")
test_rail_conn.testcase.clear()
request.addfinalizer(update_at_the_end)
Цель состоит в том, чтобы все тестовые случаи с их результатами были в словаре 'testcase', а в конце во время финализатора я хочу проверить значение [0] field = result и посмотреть, не произошло ли что-нибудь не так. Проблема в том, что после каждого запуска параметра поле тестового случая очищается, и я получаю только один результат.
Любая помощь приветствуется!
1 ответ
Светильники могут иметь область видимости "класс" (@pytest.fixture(scope='class')
) и применяться к классу с @pytest.mark.usesfixtures("fixture_name")
, Таким образом, прибор используется только один раз для запускаемых тестов, сгруппированных вместе (и включая их параметризацию) внутри класса:
https://pytest.org/latest/unittest.html#mixing-pytest-fixtures-into-unittest-testcase-style-tests
Вы также можете видеть, что "класс" доступен как область для приборов, описанных здесь: