Allure报告 03-报告Summary
1. 钩子:pytest_terminal_summary
执行完测试用例后,需要对结果进行汇总,用例总数,失败用例数,成功用例数等。
pytest有自带的一个钩子函数:pytest_terminal_summary
,查看官方文档。
# conftest.py
def pytest_terminal_summary(terminalreporter, exitstatus, config):
"""
:param terminalreporter: 报告汇总
:param exitstatus: 退出状态
:param config: 全局 Config 对象
:return:
exitstatus:
0 -- 用例全部通过
1 -- 有用例失败
2 -- 收集用i就失败了,还没执行
3 -- 其他报错
4 -- 其他报错
5 -- 收集到0条用例
"""
print(f'退出状态:{exitstatus}')
# test_allure_3.py
import allure
import requests
import json
class TestDemo:
def test_x1(self):
"""输入正确的用户名和密码"""
with allure.step('步骤1:登录前'):
print('步骤1:登录前')
allure.dynamic.feature('动态添加功能点1')
print('x11111')
allure.dynamic.title('动态添加title11')
with allure.step('步骤2:登录后'):
print('登录结束')
def test_x2(self):
"""输入错误的用户名和密码"""
with allure.step('步骤1:登录前'):
print('步骤1:登录前')
allure.dynamic.feature('动态添加功能点2')
print('x222222')
allure.dynamic.title('动态添加title22')
with allure.step('步骤2:登录后'):
print('登录结束')
执行:pytest -s test_allure_3.py
我们将其中一个用例断言失败,看看退出状态返回的是否是1。
2. 汇总用例数据
通过terminalreporte
参数,可以获取到用例测试数据汇总。并且将测试的数据发写入到json文件中,方便其他地方进行读取。
# conftest.py
def pytest_terminal_summary(terminalreporter, exitstatus, config):
"""
:param terminalreporter: 报告汇总
:param exitstatus: 退出状态
:param config: 全局 Config 对象
:return:
exitstatus:
0 -- 用例全部通过
1 -- 有用例失败
2 -- 收集用i就失败了,还没执行
3 -- 其他报错
4 -- 其他报错
5 -- 收集到0条用例
"""
print(f'退出状态:{exitstatus}')
total = terminalreporter._numcollected
if total > 0:
passed = len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown'])
failed = len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown'])
skipped = len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown'])
error = len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown'])
successful = len(terminalreporter.stats.get('passed', [])) / terminalreporter._numcollected * 100
duration = time.time() - terminalreporter._sessionstarttime
markdown_text = f"""### 执行结果:
- 运行环境: 测试环境
- 运行base_url: ----
- 持续时间: {duration: .2f} 秒
### 本次运行结果:
- 总用例数: {total}
- 通过用例:{passed}
- 跳过用例:{skipped}
- 失败用例: {failed}
- 异常用例: {error}
- 通过率: {successful:.2f} % \n
"""
print(f'用例执行结果:{markdown_text}')
with open("summary.json", 'w', encoding='utf-8') as fp:
summary = {
"total": total,
"passed": passed,
"failed": failed,
"skipped": skipped,
"error": error,
"successful": f'{successful:.2f} %',
"duration": duration
}
import json
fp.write(json.dumps(summary, indent=4))
else:
print('未收集到测试用例')
3. 完整代码
# conftest.py
def pytest_terminal_summary(terminalreporter, exitstatus, config):
"""
:param terminalreporter: 报告汇总
:param exitstatus: 退出状态
:param config: 全局 Config 对象, 等同于 request.config
:return:
exitstatus:
0 -- 用例全部通过
1 -- 有用例失败
2 -- 收集用i就失败了,还没执行
3 -- 其他报错
4 -- 其他报错
5 -- 收集到0条用例
"""
print(f'退出状态:{exitstatus}')
# 获取环境地址
base_url = config.option.base_url
print(f'获取到的base_url: {base_url}')
total = terminalreporter._numcollected
if exitstatus in [0, 1]:
passed = len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown'])
failed = len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown'])
skipped = len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown'])
error = len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown'])
successful = len(terminalreporter.stats.get('passed', [])) / terminalreporter._numcollected * 100
duration = time.time() - terminalreporter._sessionstarttime
markdown_text = f"""### 执行结果:
- 运行环境: 测试环境
- 运行base_url: {base_url}
- 持续时间: {duration: .2f} 秒
### 本次运行结果:
- 总用例数: {total}
- 通过用例:{passed}
- 跳过用例:{skipped}
- 失败用例: {failed}
- 异常用例: {error}
- 通过率: {successful:.2f} % \n
"""
print(f'用例执行结果:{markdown_text}')
with open("summary.json", 'w', encoding='utf-8') as fp:
summary = {
"total": total,
"passed": passed,
"failed": failed,
"skipped": skipped,
"error": error,
"successful": f'{successful:.2f} %',
"duration": duration
}
import json
fp.write(json.dumps(summary, indent=4))
"""后面这里可以写发送邮件或者其他形式的通知"""
else:
print('未收集到测试用例')