前言

Pytest是Python的一种强大的测试框架,它提供了丰富的功能和插件来满足各种测试需求。

其中,pytest_terminal_summary是一个钩子函数,它允许我们在测试运行结束后,添加自定义的总结信息到测试报告中。这个功能在需要对测试结果进行额外分析或者美化测试报告时非常有用。

什么是pytest_terminal_summary?

首先,我们需要了解pytest的插件钩子机制。pytest是一个非常灵活的测试框架,它允许用户通过插件来扩展其功能。每一个插件都可以实现一些钩子函数,这些函数在pytest的特定运行阶段被调用,从而实现对pytest行为的定制化。

pytest_terminal_summary是pytest的一个插件钩子,用于在所有的测试运行完成后向终端报告总结信息。在编写pytest插件或者定制化pytest测试报告的时候,你可能会用到这个钩子。

如何使用pytest_terminal_summary?

要使用pytest_terminal_summary,你需要在你的pytest插件或者conftest.py文件中定义这个方法。这个方法会在所有的测试运行结束后被自动调用。下面是一个简单的示例:

# content of conftest.py
def pytest_terminal_summary(terminalreporter):
    pass_count = len([rep for rep in terminalreporter.stats.get('passed', []) if rep.when == 'call'])
    fail_count = len([rep for rep in terminalreporter.stats.get('failed', []) if rep.when == 'call'])
    skip_count = len([rep for rep in terminalreporter.stats.get('skipped', []) if rep.when == 'call'])
    error_count = len([rep for rep in terminalreporter.stats.get('error', []) if rep.when == 'call'])

    terminalreporter.write('\n')
    terminalreporter.write(f'Passed: {pass_count}, Failed: {fail_count}, Skipped: {skip_count}, Errors: {error_count}\n')

在这个例子中,我们首先从terminalreporter的stats属性中获取了各种测试结果的数量,然后我们在终端中打印出这些数据,也可以将这些数量添加到测试报告中。

注意,terminalreporter.stats是一个字典,它包含了所有的测试结果。每个结果都是一个TestReport对象,它有一个when属性,这个属性的值可以是'setup''call'或者'teardown',分别表示测试的设置阶段,执行阶段和清理阶段。

在这个例子中,我们只关心执行阶段的结果,所以我们在获取结果的时候检查了rep.when == 'call'

def pytest_terminal_summary(terminalreporter, exitstatus, config):
    passed_tests = terminalreporter.stats.get('passed', [])
    failed_tests = terminalreporter.stats.get('failed', [])
    print(f"总共运行了 {len(passed_tests) + len(failed_tests)} 个测试,其中 {len(passed_tests)} 个通过,{len(failed_tests)} 个失败。")

这个例子会在所有测试运行完毕后,打印出总共运行了多少个测试,其中有多少个通过,有多少个失败。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

但是,这只是pytest_terminal_summary的基本用法。实际上,你可以做更多的事情。例如,你可以根据测试的运行情况,动态地改变测试报告的内容。

为了实现这一点,你需要更深入地了解terminalreporter对象。这个对象有一个stats属性,它是一个字典,包含了所有的测试结果。字典的键是测试结果的类型(如'passed'、'failed'、'skipped'等),值是一个列表,包含了该类型的所有测试结果。

每一个测试结果都是一个TestReport对象,包含了测试的详细信息,如测试的名称、测试的状态、测试的持续时间等。你可以通过这些信息来定制化你的测试报告。

例如,你可以这样使用pytest_terminal_summary

def pytest_terminal_summary(terminalreporter, exitstatus, config):
    passed_tests = terminalreporter.stats.get('passed', [])
    failed_tests = terminalreporter.stats.get('failed', [])
    total_tests = len(passed_tests) + len(failed_tests)
    total_time = sum([x.duration for x in passed_tests + failed_tests])
    
    print(f"总共运行了 {total_tests} 个测试,其中 {len(passed_tests)} 个通过,{len(failed_tests)} 个失败。")
    print(f"总共耗时 {total_time} 秒。")
    
    if failed_tests:
        print("以下测试失败了:")
        for test in failed_tests:
            print(f"- {test.nodeid}")

这个例子不仅会打印出总共运行了多少个测试,其中有多少个通过,有多少个失败,还会打印出总共耗时多少秒,以及哪些测试失败了。

方法参数:

pytest_terminal_summary方法的定义如下:

def pytest_terminal_summary(terminalreporter, exitstatus, config):
    ...
  • terminalreporter:这是一个TerminalReporter对象,它提供了一些方法来添加内容到测试报告中。是一个特殊的报告对象,用于向终端输出信息。你可以用它来打印自定义的总结信息。

  • exitstatus:这是一个整数,表示pytest的退出状态。0表示所有测试都通过,1表示有一些测试失败。

  • config:这是一个Config对象,是pytest的配置对象,包含了pytest运行的所有配置信息,表示pytest的配置信息。

总结

pytest_terminal_summary是一个特殊的钩子方法,它是pytest测试框架的一部分。这个方法在所有的测试运行结束后被调用,它的主要作用是提供一个机会来处理和显示pytest运行的总结信息。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐