python

pytest中的hooks函数

2021-12-21  本文已影响0人  小白兔胡萝卜

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

上一篇 下一篇

猜你喜欢

热点阅读