pytestmark详解

一、pytestmark是什么?

pytestmark是pytest框架提供的装饰器,可以用来装饰整个文件或文件中的某些函数,其作用是将标记(mark)与被装饰的函数或文件相关联。

在pytest中,标记是一种在运行测试用例时动态影响测试用例执行的工具。通过pytestmark,可以在pytest命令行中使用不同的标记,例如-s,-m等

二、pytestmark的使用场景

1、使用pytestmark标记来提供一些默认的参数:可通过pytestmark为整个文件设置pytest.fixture()标记。这样,已被标记为fixture的函数,就可以在文件中被其他测试用例函数直接使用。

import pytest 
@pytest.fixture() 
def foo_fixture(): 
    return 'foo module' 
pytestmark = pytest.mark.usefixtures("foo_fixture") 

def test_foo(): 
    assert "foo module" == "foo module" 

在上述代码中,我们为整个文件设置了pytest.fixture()标记,并在pytestmark中使用了usefixtures。当运行test_foo函数时,将先运行foo_fixture()函数,因此test_foo函数中的代码可以有效地使用foo_fixture()。

2、使用pytestmark标记来指定测试用例的实例化方式:可通过pytestmark将测试用例与类或函数进行关联。

import pytest


@pytest.mark.webtest
class TestSomething:
    def test_one(self):
        pass
    def test_two(self):
        pass
@pytest.mark.nighttest    
class TestAnother:
    def test_three(self):
        pass
    def test_four(self):
        pass

在上述代码中,我们通过pytestmark将TestSomething和TestAnother类与不同的mark(webtest和nighttest)关联。在运行测试时,我们可以通过-m选项来执行哪种类型的测试用例。

3、使用pytestmark指定fixture执行范围:我们可以通过@pytest.mark.用于指定Fixture的使用范围。

import pytest
@pytest.fixture(scope="module")
def foo():
    return 'foo'

def test_foo1(foo):
    assert foo == 'foo'

def test_foo2(foo):
    assert foo == 'foo'
pytestmark = pytest.mark.usefixtures("foo")

在上述代码中,我们将foo fixture设置为‘module’级别的fixture,在pytestmark中使用了usefixtures指定它的使用范围。在test_foo1和test_foo2中我们分别使用了foo fixture,它将在整个module的范围内使用。

三、pytestmark相关参数的使用方法

pytestmark也可以使用多个参数来定义一组标记列表


import pytest

@pytest.mark.parametrize("test_input, expected_output", [("3+5", 8), ("2+4", 6), ("6*9", 54)])
def test_eval(test_input, expected_output):
    assert eval(test_input) == expected_output
pytestmark = [pytest.mark.number, pytest.mark.eval] 

在上述代码中,我们使用pytest.mark.parameterize指定的参数值为test_input, expected_output。在pytestmark中,我们使用了一个长度为2的列表,分别包含了由number和eval标记所组成的标记列表。当我们运行测试用例时,可以通过“-m”参数来只运行标记为其中之一的测试用例。

四、pytestmark的多层嵌套标记

pytestmark也可以实现多层嵌套标记,使得多个标记可以被同时匹配

import pytest
@pytest.mark.parametrize("num", [1, 2, 3])
@pytest.mark.parametrize("letter", ["a", "b", "c"])
def test_multi_tag(num, letter):
    pass
pytestmark = pytest.mark.beta

在上述代码中,我们使用pytest.mark.parameterize指定了两个参数值,num和letter。在pytestmark中,我们使用了beta标记。运行时可以使用“-m”参数指定beta标记,同时也可以使用“-k”参数通过一个测试用例的名称键值对来指定需要运行的测试用例。

五、pytestmark的跨文件标记

pytestmark还可以实现跨文件标记,从而为整个测试套件添加标记。

我们可以在conftest.py文件中定义标记,在整个测试套件中使用。pytest也会自动加载相应的标记,从而使整个测试套件具有相同的属性。


#在conftest.py文件中

import pytest

# 为整个测试套件设置webtest标记
pytestmark = pytest.mark.webtest

在上述代码中,我们在conftest.py文件中定义了webtest标记。pytestmark的值设置为pytest.mark.webmark,从而为整个测试套件添加了webtest标记。在执行整个测试套件时,pytest会自动加载conftest.py文件并实现webtest标记。

六、结论

通过以上内容我们可以看出,pytestmark可以在许多方面提高测试用例的复用性和灵活性。通过使用pytestmark和标记参数,开发人员可以使pytest的整体测试环境更加高效和精准。

原创文章,作者:KLQVO,如若转载,请注明出处:https://www.506064.com/n/313337.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
KLQVO的头像KLQVO
上一篇 2025-01-07 09:43
下一篇 2025-01-07 09:43

相关推荐

  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论