详解pytest中runtestprotocol方法的实现

 更新时间:2023年10月20日 09:24:56   作者:郝同学的测开笔记  
runtestprotocol 是 pytest 执行测试流程中的一个核心函数,它主要负责调用测试函数的“setup”、“call”和“teardown”钩子函数,并生成对应的测试报告,本文将深入探究pytest中runtestprotocol方法的实现,需要的朋友可以参考下

前言

pytest-rerunfailures:优化测试稳定性的失败重试工具这篇文章中,我们查看源码时,看到了这样一行代码reports = runtestprotocol(item, nextitem=nextitem, log=False)runtestprotocol这个函数是干嘛用的呢?我们带着疑问一起探索。

runtestprotocol 函数

runtestprotocol 是 pytest 执行测试流程中的一个核心函数,它主要负责调用测试函数的“setup”、“call”和“teardown”钩子函数,并生成对应的测试报告。

runtestprotocol 函数的基本信息

runtestprotocol 函数是 pytest 测试框架中用于执行测试用例的核心函数之一,它位于 pytest 的 runner.py 模块中,定义如下:

def runtestprotocol(
    item: Item, log: bool = True, nextitem: Optional[Item] = None
) -> List[TestReport]:
    hasrequest = hasattr(item, "_request")

其中,该函数的参数包括:

  • item: 表示待执行的测试用例对象;
  • log: 控制是否打印日志,在默认情况下为 True,即打印日志;
  • nextitem: 表示下一个待执行的测试用例对象,用于实现测试顺序的控制。

函数返回一个包含 pytest.TestReport 对象的列表,每个对象表示执行一个钩子函数的测试结果。

参数解析

在上述参数中,item 是必选参数,表示待执行的测试用例对象。该参数通常由 pytest 测试框架提供,我们无需手动传入该参数。

log 参数是一个布尔值,用于控制是否打印日志。在默认情况下,该参数为 True,即会打印日志。如果你希望在测试过程中关闭日志,可以将该参数设置为 False。

nextitem 参数则表示下一个待执行的测试用例对象,用于实现测试顺序的控制。当 runtestprotocol 函数执行完当前测试用例之后,它会自动执行下一个测试用例。如果希望手动控制下一个待执行的测试用例,可以使用该参数。

源码解读

下面是对代码的解释:

def runtestprotocol(
    item: Item, log: bool = True, nextitem: Optional[Item] = None
) -> List[TestReport]:
    hasrequest = hasattr(item, "_request")
    if hasrequest and not item._request:  # type: ignore[attr-defined]
        # This only happens if the item is re-run, as is done by
        # pytest-rerunfailures.
        item._initrequest()  # type: ignore[attr-defined]

首先,我们声明了 runtestprotocol 函数,并接受三个参数:itemlognextitem。其中,item 是一个测试项对象,log 是一个布尔值,表示是否将测试结果记录到日志中,nextitem 表示下一个将要被执行的测试项(可选)。

然后,我们使用 hasattr(item, "_request") 判断 item 对象是否包含 _request 属性。如果包含,则我们检查该属性的值是否为 False,如果是,则执行 item._initrequest() 方法。这段代码主要是为了处理一种特殊情况:当测试项重新运行(例如通过 pytest-rerunfailures 插件),可能需要重新初始化 _request 属性。

接下来,我们调用 call_and_report 函数执行 setup 钩子函数,并将其结果存储在 rep 变量中:

    rep = call_and_report(item, "setup", log)

call_and_report 函数是一个辅助函数,用于执行钩子函数并生成测试报告(TestReport 对象)。在这里,我们调用该函数来执行 setup 钩子函数,并将结果存储在 rep 变量中。

然后,我们将 rep 添加到 reports 列表中:

    reports = [rep]

reports 列表用于存储测试过程中生成的所有测试报告。

接下来,我们判断上一个钩子函数是否执行成功。如果成功,则继续执行下一个钩子函数;否则,直接跳过:

    if rep.passed:
        if item.config.getoption("setupshow", False):
            show_test_item(item)
        if not item.config.getoption("setuponly", False):
            reports.append(call_and_report(item, "call", log))

首先,我们使用 rep.passed 来判断上一个钩子函数是否执行成功。如果成功,则判断是否需要在控制台显示该测试项的详细信息,如果需要,则调用 show_test_item 函数显示详细信息。然后,我们再次使用 call_and_report 来执行测试函数并生成测试报告,并将其添加到 reports 列表中。

最后,我们再次使用 call_and_report 函数执行 teardown 钩子函数,并将其结果存储在 rep 变量中:

    reports.append(call_and_report(item, "teardown", log, nextitem=nextitem))

然后,我们将 rep 添加到 reports 列表中,并返回该列表作为测试结果。

    return reports

当所有测试项执行完成后,pytest 会将测试结果打印到控制台,并将其写入日志文件。这样,我们就可以轻松地进行测试并获取测试报告。

最后

总之,runtestprotocol 函数是 pytest 测试框架中非常重要的一个函数,它用于执行测试用例并触发 pytest 钩子函数。当然我们实际场景中通常不会直接调用该函数,这里主要做一个了解,方便查看插件的源码时遇到不知道是干啥的。

以上就是详解pytest中runtestprotocol方法的实现的详细内容,更多关于pytest runtestprotocol方法的资料请关注脚本之家其它相关文章!

相关文章

  • python 绘制场景热力图的示例

    python 绘制场景热力图的示例

    这篇文章主要介绍了python 绘制场景热力图的示例,帮助大家更好的利用python绘制图像,感兴趣的朋友可以了解下
    2020-09-09
  • 基于Python开发一个小说图片PDF生成器

    基于Python开发一个小说图片PDF生成器

    本项目是一个基于 wxPython 开发的桌面应用程序,用于将图片和文字描述组合生成精美的 PDF 小说,它解决了创作者需要将图文内容快速整理成电子书的需求,特别适合绘本、图文小说、摄影作品集等场景,需要的朋友可以参考下
    2025-10-10
  • Python字典dict常用内置函数详解

    Python字典dict常用内置函数详解

    这篇文章主要介绍了Python字典dict常用内置函数详解,dict是Python中的一种内置数据类型,它是一种键值对的集合,类似于Java中的Map或其他语言中的字典,需要的朋友可以参考下
    2023-07-07
  • 浅谈Python3中datetime不同时区转换介绍与踩坑

    浅谈Python3中datetime不同时区转换介绍与踩坑

    最近的项目需要根据用户所属时区制定一些特定策略,学习、应用了若干python3的时区转换相关知识,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Python实现Word文档自动化排版的完整流程

    Python实现Word文档自动化排版的完整流程

    这篇文章主要为大家详细介绍了Python实现Word文档自动化排版的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2026-01-01
  • Django框架实现的简单分页功能示例

    Django框架实现的简单分页功能示例

    这篇文章主要介绍了Django框架实现的简单分页功能,在之前一篇留言板之上增加了简单分页功能,涉及Paginator模块的简单使用技巧,需要的朋友可以参考下
    2018-12-12
  • 浅谈python浮点数比较的三种方法

    浅谈python浮点数比较的三种方法

    在 Python 中,由于浮点数在计算机内部的表示方式是二进制的,因此进行浮点数比较时可能会出现精度问题,本文就介绍了三种解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Python轻松读取TOML文件告别手动编辑配置文件

    Python轻松读取TOML文件告别手动编辑配置文件

    这篇文章主要为大家介绍了Python轻松读取TOML文件告别手动编辑配置文件,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • python实现在函数图像上添加文字和标注的方法

    python实现在函数图像上添加文字和标注的方法

    今天小编就为大家分享一篇python实现在函数图像上添加文字和标注的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python 合并列表的八种方法

    python 合并列表的八种方法

    这篇文章主要介绍了python 连接列表的八种方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03

最新评论