【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合集见链接

相关文章
|
1月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
162 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
1月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
24 2
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
38 4
|
1月前
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
33 2
|
2月前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
69 6
基于Python访问Hive的pytest测试代码实现
|
3月前
|
Web App开发 安全 测试技术
自动化测试中的Python魔法:使用Selenium和pytest框架
【8月更文挑战第31天】 在软件开发的海洋中,自动化测试是确保航行安全的灯塔。本文将带你探索如何利用Python语言结合Selenium和pytest框架,搭建一套高效的自动化测试体系。我们将从基础设置讲起,逐步深入到编写测试用例,最后通过一个实战案例来展示如何在实际项目中运用这些工具。文章旨在为读者提供一套清晰的自动化测试解决方案,让你的开发之旅更加顺畅。
|
3月前
|
JavaScript 前端开发 测试技术
顺藤摸瓜🍉:用单元测试读懂 vue3 watch 函数
顺藤摸瓜🍉:用单元测试读懂 vue3 watch 函数
|
安全 Java 测试技术
python接口自动化(三)--如何设计接口测试用例(详解)
上篇我们已经介绍了什么是接口测试和接口测试的意义。在开始接口测试之前,我们来想一下,如何进行接口测试的准备工作。或者说,接口测试的流程是什么?有些人就很好奇,接口测试要流程干嘛?不就是拿着接口文档直接利用接口 测试工具测试嘛。其实,如果只是三五个接口,你可以这么做一个临时的接口测试。但是,如果是上百个接口,或者,你们公司的这个项目,第一次做接口测试,那么,我们还是很有必要严格遵守接口测试的流程。
359 0
python接口自动化(三)--如何设计接口测试用例(详解)
|
测试技术
正交试验测试用例设计及工具推荐
在科研和生产实践中,人们往往要做许多次实验来进行某项研究。实验条件一般包括很多因素,当因素的值不同时,实验的结果也不一样。如果想把每个因素的每个值都要实验一遍,总实验数就等于各因素的值的个数的乘积,而这个数往往很大,超过了可接受的成本。 例如,假设某个实验由A,B,C,D四个因素,每个因素都有10个不同的取值,那么如果想把每个因素都考虑到,我们需要做 10*10*10*10=10000次实验。 为了减少实验数目,我们必须选出那些最有代表性的例子。于是,就要用到了正交表法(Orthogonal Array Testing Strategy)。
342 0
正交试验测试用例设计及工具推荐
|
算法 安全 测试技术
【软件测试】测试用例的设计方法
测试用例写的过于简单,则可能失去了测试用例的意义,设计过于简单的测试用例其实并没有真正的进行设计,只是把需要测试的功能模块记录下来而已,它的作用仅仅是在测试过程中作为一个简单的测试计划,提醒测试人员测试的主要功能包括哪些而已,测试用例设计的本质应该是在设计的过程中理解需求,检验需求,并把对软件系统的测试方法的思路记录下来,以便指导将来的测试
【软件测试】测试用例的设计方法