是否只有在测试的所有参数都执行后才能在python中执行finalizer fixture?
Is it possible to execute finalizer fixture in python only after all parameters of the test are executed?
我正在尝试在我的测试用例 运行 的所有参数之后执行终结器夹具。问题是我的终结器在每个参数 运行 之后执行,所以我需要的值正在重置。示例:
@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函数在一个单独的class中如下:
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] 字段 = 结果,看看是否有任何失败。问题是在每个参数 运行 之后,测试用例字段被清除,我只得到一个结果。
感谢任何帮助!
夹具可以具有 'class' 范围 (@pytest.fixture(scope='class')
) 并应用于具有 @pytest.mark.usesfixtures("fixture_name")
的 class。这样,夹具仅用于 运行 的测试,在 class:
中组合在一起(并包括它们的参数化)
https://pytest.org/latest/unittest.html#mixing-pytest-fixtures-into-unittest-testcase-style-tests
您还可以看到 'class' 可用作固定装置的范围,如下所述:
我正在尝试在我的测试用例 运行 的所有参数之后执行终结器夹具。问题是我的终结器在每个参数 运行 之后执行,所以我需要的值正在重置。示例:
@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函数在一个单独的class中如下:
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] 字段 = 结果,看看是否有任何失败。问题是在每个参数 运行 之后,测试用例字段被清除,我只得到一个结果。
感谢任何帮助!
夹具可以具有 'class' 范围 (@pytest.fixture(scope='class')
) 并应用于具有 @pytest.mark.usesfixtures("fixture_name")
的 class。这样,夹具仅用于 运行 的测试,在 class:
https://pytest.org/latest/unittest.html#mixing-pytest-fixtures-into-unittest-testcase-style-tests
您还可以看到 'class' 可用作固定装置的范围,如下所述: