测试框架pytest教程(6)钩子函数hook开发pytest插件

这篇具有很好参考价值的文章主要介绍了测试框架pytest教程(6)钩子函数hook开发pytest插件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

pytest hook 函数也叫钩子函数,pytest 提供了大量的钩子函数,可以在用例的不同生命周期自动调用。 比如,在测试用例收集阶段,可利用 hook 函数修改测试用例名称的编码。

pytest的hook是基于Python的插件系统实现的,使用特定的命名规范和装饰器来定义钩子函数。你可以在pytest插件或conftest文件中定义这些钩子函数。

pytest 可以识别到三种插件

内置插件:从 pytest 内部 _pytest 目录加载的插件

外部插件:通过 pip 安装的插件(比如: pip install pytest-ordering )。

conftest.py 插件:测试目录中的 conftest.py 加载

常用的pytest钩子函数

1. `pytest_configure(config)`: 在pytest启动时调用,可用于注册自定义标记、插件等。

2. `pytest_collection_modifyitems(config, items)`: 测试收集阶段调用,可以修改、筛选或排序收集到的测试项。

3. `pytest_runtest_protocol(item, nextitem)`: 在运行每个测试用例之前和之后调用,可以执行初始化、清理或自定义测试流程等操作。

4. `pytest_report_teststatus(report)`: 在测试用例执行后调用,可用于自定义测试结果报告。

5. `pytest_terminal_summary(terminalreporter)`: 在测试会话结束时调用,可用于生成自定义的测试总结报告。

通过使用这些钩子函数,你可以在pytest的不同阶段添加自己的逻辑和行为。这使得您可以自定义测试收集、执行、报告等方面,以满足特定的需求。

有许多其他的pytest钩子函数可以用于不同的目的和扩展。你可以在pytest的官方文档中查找完整的钩子函数列表以及每个钩子的详细说明和示例。

开发插件

pytest 提供了大量的 hook 函数,执行过程中几乎所有的行为都是可以定制的。那么,pytest 可以改写哪 些行为呢? 文字版 pytest hook 执行顺序:

root
└── pytest_cmdline_main
├── pytest_plugin_registered
├── pytest_configure
│ └── pytest_plugin_registered
├── pytest_sessionstart
│ ├── pytest_plugin_registered
│ └── pytest_report_header
├── pytest_collection
│ ├── pytest_collectstart
│ ├── pytest_make_collect_report
│ │ ├── pytest_collect_file
│ │ │ └── pytest_pycollect_makemodule
│ │ └── pytest_pycollect_makeitem
│ │ └── pytest_generate_tests
│ │ └── pytest_make_parametrize_id
│ ├── pytest_collectreport
│ ├── pytest_itemcollected
│ ├── pytest_collection_modifyitems
│ └── pytest_collection_finish
│ └── pytest_report_collectionfinish
├── pytest_runtestloop
│ └── pytest_runtest_protocol
│ ├── pytest_runtest_logstart
│ ├── pytest_runtest_setup
│ │ └── pytest_fixture_setup
│ ├── pytest_runtest_makereport
│ ├── pytest_runtest_logreport
│ │ └── pytest_report_teststatus
│ ├── pytest_runtest_call
│ │ └── pytest_pyfunc_call
│ ├── pytest_runtest_teardown
│ │ └── pytest_fixture_post_finalizer
│ └── pytest_runtest_logfinish
├── pytest_sessionfinish
│ └── pytest_terminal_summary
└── pytest_unconfigure

可以利用 pytest hook 强大的功能开发出自己的插件。

hook和fixture的区别

在pytest中,Hooks(钩子)和Fixtures(装置)是两个不同的概念。

Hooks(钩子)是pytest提供的一组钩子函数,用于自定义和扩展测试流程。钩子函数在特定的时间点被调用,并允许你插入自定义的代码来修改、补充或拦截测试操作,比如定制报告、自定义收集规则、执行前/后的初始化和清理等。Hooks通常由插件或conftest文件定义,并使用特定的命名规范和装饰器进行标记。使用hooks可以灵活地定制和扩展pytest的行为。

Fixtures(装置)是pytest的一项功能,用于管理测试用例的前置和后置操作。Fixture可以被看作为测试用例的准备和清理工作,并且可以在多个测试用例之间共享数据和资源。Fixture函数使用`@pytest.fixture`装饰器进行标记,并在测试函数的参数中使用。当测试函数需要使用该装置时,fixture函数将被自动执行并提供必要的数据和资源。Fixture可以执行一些初始化操作,为测试用例提供必要的数据,以及在测试结束后进行清理工作。使用fixture可以提高代码的复用性和可维护性,并减少测试用例之间的重复工作。

总结起来,Hooks允许你定制和扩展测试流程,而Fixtures则用于管理测试用例的前置和后置操作,并提供必要的数据和资源。Hooks是用于自定义pytest的整体行为,而Fixtures是用于测试用例级别的准备和清理工作。两者可以一起使用,以实现更高级别的自定义和测试管理。

pytest_collection_modifyitems

def pytest_collection_modifyitems(
    session: "Session", config: "Config", items: List["Item"]
) -> None:
    """Called after collection has been performed. May filter or re-order
    the items in-place.

    :param pytest.Session session: The pytest session object.
    :param pytest.Config config: The pytest config object.
    :param List[pytest.Item] items: List of item objects.
    """

可以看到该方法在用例收集后执行,可以筛选或者对用例执行顺序进行修改。 

插件开发-筛选收集到的用例

当你想要自定义收集阶段中的测试项时,可以使用`pytest_collection_modifyitems`钩子函数。这个钩子函数在pytest的测试收集过程中被调用,允许你对收集到的测试项进行修改、筛选或排序。

下面是一个使用`pytest_collection_modifyitems`的例子,假设你希望在测试收集阶段中只运行有特定标记的测试用例(比如`smoke`标记),在根目录的conftest.py中添加如下方法:

def pytest_collection_modifyitems(config, items):
    marked_items = []
    unmarked_items = []

    # 将有"smoke"标记的测试项放入marked_items列表,其他放入unmarked_items列表
    for item in items:
        if 'smoke' in item.keywords:
            marked_items.append(item)
        else:
            unmarked_items.append(item)

    # 只保留有"smoke"标记的测试项
    items[:] = marked_items

    # 打印被移除的未标记项的名称
    for item in unmarked_items:
        print(f"Skipping unmarked test: {item.nodeid}")

在上述代码中,`pytest_collection_modifyitems`钩子函数接收两个参数:`config`表示pytest的配置对象,`items`是测试收集阶段收集到的所有测试项(测试用例)的列表。我们首先遍历每个测试项,将有"smoke"标记的项放入`marked_items`列表,其他项放入`unmarked_items`列表。然后,我们通过将`items`列表替换为`marked_items`列表,实现只保留有"smoke"标记的测试项。最后,我们遍历`unmarked_items`列表,打印被移除的未标记项的名称作为提示信息。

测试框架pytest教程(6)钩子函数hook开发pytest插件,pytest,pytest,自动化,测试

可以看到test_b被跳过 

插件开发-改写用例名称编码

测试用例如下


@pytest.mark.parametrize("name",["哈利","赫敏"])
def test_encode(name):
    print(name)

测试框架pytest教程(6)钩子函数hook开发pytest插件,pytest,pytest,自动化,测试

运行时会出现乱码

在conftest.py中添加如下方法

def pytest_collection_modifyitems(config, items):
    for item in items:
        item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')

再次运行可以看到节点id显示为中文了。

测试框架pytest教程(6)钩子函数hook开发pytest插件,pytest,pytest,自动化,测试

 插件打包

软件测试 | Pytest测试框架之插件开发_pytest_hook_函数文章来源地址https://www.toymoban.com/news/detail-664093.html

到了这里,关于测试框架pytest教程(6)钩子函数hook开发pytest插件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 测试框架pytest教程(11)-pytestAPI

    常量         `pytest.approx` 是一个用于进行数值近似比较的 pytest 断言工具。 在测试中,有时候需要对浮点数或其他具有小数部分的数值进行比较。然而,由于浮点数精度限制,直接使用相等判断可能会导致测试不稳定或失败。这时,就可以使用 `pytest.approx` 工具来进行近似比

    2024年02月11日
    浏览(37)
  • 【自动化测试教程】 —— pytest 框架详解 ~

    特点: 容易上手, 入门简单, 文档丰富, 文档中有很多参考案例 支持简单的单元测试和复杂的功能测试 支持参数化 执行测试用例过程中, 支持跳过操作 支持重复失败的case 支持运行Nose, unittest编写测试用例 pytest支持很多第三方插件 方便和持续集成工具集成 断言方法: assert res

    2024年02月12日
    浏览(52)
  • 测试框架pytest教程(2)-用例依赖库-pytest-dependency

    对于 pytest 的用例依赖管理,可以使用  pytest-dependency  插件。该插件提供了更多的依赖管理功能,使你能够更灵活地定义和控制测试用例之间的依赖关系。 Using pytest-dependency — pytest-dependency 0.5.1 documentation 安装 pytest-dependency 插件: 依赖方法和被依赖方法都需要使用装饰器

    2024年02月11日
    浏览(36)
  • 测试框架pytest教程(10)自定义命令行-pytest_addoption

    `pytest_addoption`是pytest插件系统中的一个钩子函数,用于向pytest添加自定义命令行选项。 在pytest中,可以使用命令行选项来控制测试的行为和配置。`pytest_addoption`钩子函数允许您在运行pytest时添加自定义的命令行选项,以扩展pytest的功能。 下面是一个使用`pytest_addoption`钩子函

    2024年02月11日
    浏览(34)
  • 自动化测试框架pytest系列之8个常用的装饰器函数

    自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客   自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客 自动化测试框架pytest系列之强大的fixture功能,为什么fixture强大?一文拆解它的功能参数。(三)-CSDN博客 接上文  3.5 pytest的8个装饰器 在之前的文章可以看到,

    2024年02月02日
    浏览(48)
  • 测试框架pytest教程(9)跳过测试skip和xfail

    满足条件时跳过  

    2024年02月11日
    浏览(35)
  • pytest 自定义HOOK函数

    除了系统提过的HOOK函数外,也可以通过自定义HOOK的方式实现想要的功能。 首先创建一个py文件,里面定义自己的HOOK函数,主要pytest里面的hook函数必须以pytest开头。 其次创建自己的插件类,user类的重写__init__方法,注册钩子的时候带入pytest的config配置。在该方法中设置钩子

    2024年02月16日
    浏览(36)
  • 测试框架pytest教程(7)实现 xunit 风格的setup

    pytest支持setup和teardown,对于使用unittest和nose框架的用户来说对这些很熟悉,但是在pytest可以使用功能更强大的fixture来实现固定装置。 如果单个模块中有多个测试函数和测试类,您可以选择实现以下固定方法,这些方法通常会为所有函数调用一次: 在调用类的所有测试方法之

    2024年02月11日
    浏览(36)
  • Angular 17+ 高级教程 – Component 组件 の 生命周期钩子 (Lifecycle Hooks)

    之前在 Component 组件 の Angular Component vs Custom Elements 文章中,我们有学习过几个基础的 Lifecycle Hooks。 比如 OnChanges、OnInit、AfterViewInit、OnDestroy,但那篇只是微微带过而已。 这篇让我们来深入理解 Angular 的 Lifecycle Hooks。   在 Component 组件 の Dependency Injection NodeInjector 文章中

    2024年03月09日
    浏览(51)
  • 测试框架pytest教程(5)运行失败用例-rerun failed tests

    运行这个文件,2个失败,48个通过。 要运行上次失败的测试用例,可以使用 --lf (或 --last-failed )选项来告诉pytest只运行上次运行时失败的测试。 命令行示例: 或者在pytest配置文件(比如pytest.ini)中设置: 这样,pytest会检测上次运行时失败的测试用例,并只运行这些失败

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包