pytest中的hooks函数

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))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容