pytest的测试用例执行完成后,我们需要获取执行结果,以便统计测试结果,保存测试失败日志.....
常用函数:
pytest_terminal_summary、
pytest_runtest_makereport、
pytest_report_teststatus
import time
from _pytestimport terminal
from utils.logimport log
import pytest
# teardown之后运行
def pytest_terminal_summary(terminalreporter, exitstatus, config):
# print(terminalreporter._session)
# print(terminalreporter._showfspath)
# print(terminalreporter.stats)
# print(terminalreporter.startdir)
# print(terminalreporter.report_collect(False))
# print(exitstatus)
# print(config)
caseNum = terminalreporter._numcollected
passed =len([ifor iin terminalreporter.stats.get('passed', [])if i.when !='teardown'])
failed =len([ifor iin terminalreporter.stats.get('failed', [])if i.when !='teardown'])
error =len([ifor iin terminalreporter.stats.get('error', [])if i.when !='teardown'])
skipped =len([ifor iin terminalreporter.stats.get('skipped', [])if i.when !='teardown'])
passRate = (passed / (passed + failed)) *100
testTime = time.time() - terminalreporter._sessionstarttime
log.info("test result - short information:\n"
"total cases: {}\n"
"passed: {}\n"
"failed: {}\n"
"error: {}\n"
"skipped: {}\n"
"pass rate: {}%\n"
"total times: {} seconds".format(caseNum,
passed,
failed,
error,
skipped,
passRate,
testTime))
# 运行用例的过程会经历三个阶段:setup-call-teardown, 每个阶段都会返回Result对象和TestReport对象以及对象属性。
# setup和teardown上面的用例默认都没有,结果都是passed。
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
out =yield # 钩子函数的调用结果
res = out.get_result()# 获取用例执行结果
# res主要有以下属性
# 'nodeid': 节点ID,
# 'location': case位置,
# 'keywords': 关键信息,
# 'outcome': case结果, 如pass,failed...,
# 'longrepr': case异常信息,
# 'when': case类型,如call...,
# 'user_properties': [],
# 'sections': case输出日志,
# 'duration': case时间,
# 'extra': []
if res.when =="call" and res.outcome =="failed":# 只获取call用例failed时的信息
# log.info("test failed = {}".format(item))
# log.info("exception = {}".format(call))
log.info("makereport res = {}".format(res))
# print(res.longrepr)
# print(res.duration)
# print(res.__dict__)
# 运行用例的过程会经历三个阶段:setup-call-teardown,每个阶段都会返回Result对象和TestReport对象以及对象属性。
# setup和teardown上面的用例默认都没有,结果都是passed。
# def pytest_report_teststatus(report, config):
# report相关的属性,参考以下
# '_from_json',
# '_get_verbose_word',
# '_to_json',
# 'caplog',
# 'capstderr',
# 'capstdout',
# 'count_towards_summary',
# 'duration',
# 'failed',
# 'from_item_and_call',
# 'fspath',
# 'get_sections',
# 'head_line',
# 'keywords',
# 'location',
# 'longrepr',
# 'longreprtext',
# 'nodeid',
# 'outcome',
# 'passed',
# 'sections',
# 'skipped',
# 'toterminal',
# 'user_properties',
# 'when'
# if report.when == "call" and report.outcome == "failed":
# log.info("teststatus res = {}".format(report))
网友评论