领取资料,咨询答疑,请➕wei: June__Go
上一小节我们学习了pytest_report_collectionfinish钩子函数的使用方法,本小节我们讲解一下pytest_report_testitemFinished钩子函数的使用方法。
pytest_report_testitemFinished
钩子函数在每个测试项(测试函数或测试方法)执行完成后被调用。这个钩子可以用来获取测试结果、执行自定义的报告逻辑,或者在测试结束后进行一些清理工作。以下是一个具体的代码示例,展示了如何在 conftest.py
文件中使用这个钩子函数:
# conftest.py
import pytest
# 全局变量用于存储测试结果
test_results = {}
def pytest_report_testitemFinished(item, report):
# 获取测试项的名称和结果
test_name = item.name
test_result = report.outcome
# 将测试结果存储在全局字典中
test_results[test_name] = test_result
# 根据测试结果执行不同的操作
if test_result == "passed":
print(f"{test_name} passed.")
elif test_result == "failed":
print(f"{test_name} failed.")
print(f"Failure details: {report.longrepr}")
elif test_result == "skipped":
print(f"{test_name} skipped.")
else:
print(f"{test_name} had an unknown outcome: {test_result}")
# 如果需要,可以在这里执行一些清理工作,例如关闭资源
# ...
# 在测试运行结束时,可以输出所有测试结果
def pytest_sessionfinish(session, exitstatus):
# 输出所有测试项的结果
for test_name, result in test_results.items():
print(f"{test_name}: {result}")
# 清空测试结果字典,为下一次测试会话做准备
test_results.clear()
在这个示例中,我们首先定义了一个全局字典 test_results
来存储每个测试项的名称和结果。在 pytest_report_testitemFinished
钩子函数中,我们根据测试结果的 outcome
属性(可以是 "passed"、"failed"、"skipped" 或其他值)来执行不同的操作。例如,我们可以打印出失败的测试项的详细信息。
我们还定义了一个 pytest_sessionfinish
钩子函数,在测试会话结束时输出所有测试项的结果,并清空 test_results
字典,以便为下一次测试会话做准备。
请注意,这个示例中的代码仅用于演示如何使用 pytest_report_testitemFinished
钩子函数来处理测试结果。在实际应用中,你可能需要根据具体的测试需求来调整这些操作,例如生成更详细的测试报告或者执行更复杂的后处理逻辑。
在这个复杂的示例中,我们将使用 pytest_report_testitemFinished
钩子函数来实现一个更高级的测试结果处理流程。我们将在测试用例完成后收集详细的结果信息,包括执行时间、断言结果、异常信息等,并在测试会话结束时生成一个详细的测试报告。此外,我们还将展示如何使用 pytest_sessionfinish
钩子函数来执行测试后的清理工作。
首先,确保你的项目中有一个 conftest.py
文件。然后,在 conftest.py
文件中定义 pytest_report_testitemFinished
和 pytest_sessionfinish
钩子函数:
# conftest.py
import pytest
import json
from datetime import datetime
# 全局变量用于存储测试结果
test_results = {}
def pytest_report_testitemFinished(item, report):
# 获取测试项的名称和结果
test_name = item.name
test_result = report.outcome
# 获取测试执行时间
execution_time = report.duration
# 获取断言结果和异常信息
assert_count = len(report.assertion_list)
exception_info = report.longrepr if report.failed else None
# 创建测试结果字典
test_result_data = {
'name': test_name,
'outcome': test_result,
'duration': execution_time,
'assert_count': assert_count,
'exception_info': exception_info
}
# 将测试结果存储在全局字典中
test_results[test_name] = test_result_data
# 根据测试结果执行不同的操作
if test_result == "passed":
print(f"{test_name} passed in {execution_time:.2f} seconds.")
elif test_result == "failed":
print(f"{test_name} failed in {execution_time:.2f} seconds.")
if exception_info:
print(f"Exception: {exception_info}")
elif test_result == "skipped":
print(f"{test_name} skipped.")
def pytest_sessionfinish(session, exitstatus):
# 获取当前时间戳
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 创建测试报告文件
report_file = f"pytest_test_report_{timestamp}.json"
# 将测试结果写入 JSON 文件
with open(report_file, 'w') as json_report:
json.dump(test_results, json_report, indent=4)
# 打印报告文件的路径
print(f"\nTest report saved to: {os.path.abspath(report_file)}")
# 执行清理工作,例如关闭数据库连接或网络资源
# ...
# 清空测试结果字典,为下一次测试会话做准备
test_results.clear()
在这个示例中,我们在 pytest_report_testitemFinished
钩子函数中收集了每个测试用例的详细信息,包括名称、结果、执行时间、断言数量和异常信息。我们将这些信息存储在全局字典 test_results
中,并根据测试结果打印相应的信息。
在 pytest_sessionfinish
钩子函数中,我们创建了一个 JSON 文件来保存所有测试用例的结果。这个文件包含了所有测试用例的详细信息,可以用于后续的分析或报告生成。我们还打印了报告文件的路径,以便用户可以轻松地找到它。
请注意,这个示例中的代码仅用于演示如何使用 pytest_report_testitemFinished
和 pytest_sessionfinish
钩子函数来处理测试结果和生成报告。在实际应用中,你可能需要根据具体的测试需求来调整这些操作,例如生成不同格式的报告或者执行更复杂的后处理逻辑。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!领取资料,咨询答疑,请➕wei: June__Go