【pytest官方文档】解读- 如何自定义mark标记,并将测试用例的数据传递给fixture函数

简介: 【pytest官方文档】解读- 如何自定义mark标记,并将测试用例的数据传递给fixture函数

在之前的分享中,我们知道可以使用yield或者return关键字把fixture函数里的值传递给test函数


这种方法很实用,比如我在fixture函数里向数据库里插入必要的测试数据,那我就可以把相关数据返回给test函数用来做相关断言查询等操作。


那如果我想把test函数(也就是测试用例)中的数据传给fixture函数使用,要如何实现呢?


直接先贴上一段示例代码:


import pytest
@pytest.fixture
def fixt(request):
    marker = request.node.get_closest_marker("fixt_data")
    if marker is None:
        # Handle missing marker in some way...
        data = None
    else:
        data = marker.args[0]
    # Do something with the data
    return data
@pytest.mark.fixt_data(42)
def test_fixt(fixt):
    assert fixt == 42


一、前置知识


代码中可能有2个知识点,可能有的小伙伴并不熟悉,分别来看下。


1. Mark 标记


什么是mark标记,干什么用?


标记可以将元数据应用于测试函数(注意,不能是fixture函数),后续可以通过fixture函数或者plugins插件进行访问。


框架有一些内置的marks,也可以支持我们自定义


内置的在之前的系列分享中有出现过几个,比如:


  • pytest.mark.parametrize:参数化
  • pytest.mark.skip:跳过测试用例
  • pytest.mark.skipif: 根据条件跳过用例

其他就不展开了,上述提到的分享文章链接会附在文末。


而在上述示例代码中,pytest.mark.fixt_data则是属于自定义的mark标记,fixt_data我也可以改成fixt_pingguo也是可以的。


2. request


request本身也是一个fixture函数,但是很特殊,用于提供当前正在执行请求的上下文信息。


在上述示例代码中,测试函数test_fixt请求了fixture函数fixt,那么在这次请求中相关联到的信息就可以在request中获得。


比如:


  • fixturename: 当前这个fixture函数的名称
  • module: 当前测试函数所在的模块
  • scope:当前fixture函数作用范围
  • node:基于当前测试范围搜集到的底层节点对象,这里又包含了很多信息。
    ...


就不一一展开了,有兴趣的童鞋可以在编辑器里打个断点,查看对应的信息详情。


1268169-20220904204505732-1937635885.png


二、通过自定义mark传递数据


回到示例代码,我们可以先直接执行一下代码。


1268169-20220904205040998-442273743.png


测试是通过的(warning先忽略,因为没有注册自定义的mark),也就是说@pytest.mark.fixt_data(42)中的42是成功的带到了fixture函数中,经过函数中的处理后最后返回出来。


其中的get_closest_marker("fixt_data")方法,是返回与名称fixt_data匹配的第一个mark,从最近的级别到更远的级别,比如从函数到模块级别。

所以在这里,被找到的mark就是我们自定义的这个@pytest.mark.fixt_data(42)标记了。


1. 自定义mark知识点

标记是使用工厂对象pytest.mark动态创建的,用于装饰器,所以我们可以用语法糖@直接使用即可。


mark对象被创建之后,就被会收集起来,然后可以通过fixture或带有Node.iter_markers的钩子函数访问,可以访问到这个mark对象的属性。

有 2 个属性:


  • mark.args:这是个元组
  • mark.kwargs:这是个字典


所以我们可以使用上面的方式来进行传参,比如现在新建一个自定义mark:


@pytest.mark.timeout(10, "slow", method="thread")
def test_function():
    ...


这里传参实际上就是


mark.args == (10, "slow")
mark.kwargs == {"method": "thread"}


回到最上方的示例代码,在fixture函数中就可以使用data = marker.args[0]来获取到参数42

如果在测试函数上同时使用了多个自定义mark,那么举例测试函数最近的mark就会被首先迭代。比如:


@pytest.mark.timeout(10, "slow", method="thread")
@pytest.mark.slow
def test_function():
    ...


结果就是先@pytest.mark.slow,然后是@pytest.mark.timeout


2. 注册自定义的mark


在运行最上方的示例代码时出现了一个warning,因为我们没有注册自定义的标记导致,现在来进行注册。

新建pytest.ini配置文件,在里面添加即可:


[pytest]
markers =
    fixt_data: pingguo test
    fixt_data2


这里冒号:后面的描述是可选的,比如fixt_data2就是没有添加描述。

重新执行下最上方的代码:


platform win32 -- Python 3.9.12, pytest-7.1.3, pluggy-1.0.0
rootdir: D:\PythonCode\my_python, configfile: pytest.ini
collected 1 item
usemarks.py .
============================== 1 passed in 0.00s ==============================
Process finished with exit code 0


注册完成。

pytest合集见链接

相关文章
|
24天前
|
消息中间件 存储 测试技术
【消息队列开发】 实现MemoryDataCenterTests类——测试管理内存数据
【消息队列开发】 实现MemoryDataCenterTests类——测试管理内存数据
|
8天前
|
人工智能 分布式计算 DataWorks
首批!阿里云 MaxCompute 完成中国信通院数据智能平台专项测试
2024年5月31日,在中国信通院组织的首批数据智能平台专项测试中,阿里云数据智能平台解决方案(MaxCompute、DataWorks、PAI)顺利完成测试。
74 5
首批!阿里云 MaxCompute 完成中国信通院数据智能平台专项测试
|
12天前
|
数据可视化 数据挖掘 定位技术
在服务中收集和测试数据
【6月更文挑战第16天】本文讨论了数据收集和测试的重要性,指出样本量应根据时间和预算调整。数据分析涉及比较结果与假设,可视化数据以增强理解,并通过统计测试确认显著性。设计的持续优化是关键,适应变化的业务、技术和用户需求,数据驱动的方法能提供最佳用户体验。
22 5
在服务中收集和测试数据
|
1天前
|
存储 测试技术
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
8 0
【工作实践(多线程)】十个线程任务生成720w测试数据对系统进行性能测试
|
2天前
|
存储 测试技术 Python
记一次线上安全测试中误用父类属性导致数据污染的解决方案
在线上安全测试的过程中,会使用 Nmap 进行端口扫描,为了提升端口扫描的效率,扫描策略通常是检测常用端口是否处于开放状态,并在父类中使用名为 all_open_ports 的属性来记录这些开放的端口。 在后续的测试过程中,需要检查所涉及的端口是否包含在 all_open_ports 中。如果不存在,就需要进一步对这些端口进行开放检测。如果端口的检测结果是开放的,测试将继续进行并将这些端口记录到 all_open_ports 中,以便在下次遇到相同端口时无需重复检测。 然而,由于安全测试是多线程进行的,某些情况下可以将 all_open_ports 理解为共享变量,这导致当两个不同的测试环境同
|
16天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(七十一)-java+ selenium自动化测试-自定义类解决元素同步问题(详解教程)
【6月更文挑战第12天】本文介绍了如何创建一个自定义类库来解决自动化测试中的元素同步问题。作者指出,大部分错误源于元素因时间不同步而引发,为此提供了一种解决方案。在项目实践中,首先在`library`包下创建名为`MyWait`的类,包含一个方法`isElementPresent`,该方法通过循环尝试并等待指定元素出现,避免了直接使用时间等待可能导致的不准确性。之后,在测试类中调用此自定义方法,成功实现了元素同步。代码示例展示了如何在Java+Selenium自动化测试中应用这个自定义类。
33 2
|
18天前
|
SQL DataWorks 安全
DataWorks产品使用合集之在进行测试数据集成时,目标库的数据是源库数据的3倍量,是什么导致的
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
DataWorks产品使用合集之在进行测试数据集成时,目标库的数据是源库数据的3倍量,是什么导致的
|
1天前
|
XML 测试技术 Linux
技术笔记:sipp重放rtp数据测试FreeSWITCH
技术笔记:sipp重放rtp数据测试FreeSWITCH
|
4天前
|
运维 Java 测试技术
Spring运维之业务层测试数据回滚以及设置测试的随机用例
Spring运维之业务层测试数据回滚以及设置测试的随机用例
7 0
|
9天前
|
Java 编译器
Java自定义测试框架测试对象中相应的成员方法
Java自定义测试框架测试对象中相应的成员方法
12 0