示例场景
在测试执行结束时生成汇总报告。
from lib.util.sendWhat import send_msg
import time
from colorama import Fore, Style, init
from _pytest.terminal import TerminalReporter
# 初始化 colorama
init(autoreset=True)
class CustomSummaryReporter:
def __init__(self, terminalreporter: TerminalReporter):
self.terminalreporter = terminalreporter
def generate_summary(self):
stats = self.terminalreporter.stats
total = self.terminalreporter._numcollected
passed = len(stats.get('passed', []))
failed = len(stats.get('failed', []))
error = len(stats.get('error', []))
skipped = len(stats.get('skipped', []))
xfailed = len(stats.get('xfailed', []))
xpassed = len(stats.get('xpassed', [])) # 预期失败但实际通过的用例
start_time = self.terminalreporter._sessionstarttime
duration = time.time() - start_time
duration_str = time.strftime("%H:%M:%S", time.gmtime(duration))
desc = f"""
本次执行情况如下:
总用例数为:{total}
通过用例数:{passed}
失败用例数: {failed}
错误用例数:{error}
预期失败的用例:{xfailed}
预期失败但实际通过的用例:{xpassed}
跳过用例数:{skipped}
执行时长:{duration_str}
测试报告地址:[http://192.168.220.1:60000/index.html](http://192.168.220.1:60000/index.html)
"""
# 使用 colorama 设置颜色和样式,拼接分隔符
summary_title = f"{Fore.YELLOW}{Style.BRIGHT}{'-' * 20} Execution Summary {'-' * 20}{Style.RESET_ALL}"
# 在终端中打印结果
self.terminalreporter.write(summary_title + '\n') # 打印带颜色和分隔符的标题
self.terminalreporter.write(f"{Fore.GREEN}{desc}{Style.RESET_ALL}\n") # 将描述内容设置为绿色
# 发送描述信息到企业微信
send_msg(desc)
def pytest_terminal_summary(terminalreporter: TerminalReporter):
reporter = CustomSummaryReporter(terminalreporter)
reporter.generate_summary()
终端控制台输出:
发送到企业微信的结果:
解释:
1.CustomSummaryReporter 类:
init 方法:接收 TerminalReporter 实例并存储在实例变量中。
generate_summary 方法:生成测试结果的总结,包括计算统计信息、格式化输出和发送到企业微信。
2.pytest_terminal_summary 函数:
创建 CustomSummaryReporter 实例,并调用 generate_summary 方法以打印总结和发送通知。
这种方式将逻辑封装在 CustomSummaryReporter 类中,使得代码更具模块性和可维护性,并且在 pytest_terminal_summary 函数中使用了这个类。