深入了解Python中Pytest Markers的使用方法

 更新时间:2023年09月05日 09:06:56   作者:郝同学的测开笔记  
从这篇开始,逐一解决fixture是啥,mark是啥,参数request是啥,钩子函数是啥,parametrize参数化是啥,这些问题,本片先介绍一下mark是啥,以及如何使用

Markers有啥用?

当使用 Pytest 运行测试时,可以通过标记(Markers)来为测试函数或类添加自定义的元数据。标记可以用于对测试进行分类、过滤和定制化。

查看所有Markers

pytest --markers

常用的内置标记

内置标记(Built-in Markers): Pytest 提供了一些内置的标记,用于常见的测试场景。一些常用的内置标记包括:

  • @pytest.mark.skip: 标记该测试为跳过;
  • @pytest.mark.parametrize: 标记该测试使用参数化,可以为测试函数指定多组参数;
  • @pytest.mark.xfail: 标记该测试为预期失败;
  • @pytest.mark.skipif: 根据条件动态地跳过某个测试。
  • @pytest.mark.timeout:为测试用例设置运行超时时间。

@pytest.mark.skip

可以设置一个可选参数reason,表明跳过的原因

import pytest
​
@pytest.mark.skip()
def test_01():
    pass

未增加跳过原因,输出内容为

test_demo.py::test_01 SKIPPED (unconditional skip)                       [100%]
Skipped: unconditional skip

我们增加跳过原因,看看输出结果

import pytest
​
@pytest.mark.skip(reason='skip reason')
def test_01():
    pass

执行输出结果如下

test_demo.py::test_01 SKIPPED (skip reason) [100%] Skipped: skip reason

可以看到会直接显示具体原因。

pytest.skip方法

这里我们顺带提一下这个方法。可以在测试执行期间强制跳过

def test_01():
    pytest.skip(reason="skip reason")

另外,还可以为其设置一个布尔型的参数allow_module_level(默认为False),表明是否允许在模块中调用这种方法,如果置为True,则跳过模块中剩余的部分,也就是说其值为True时这个模块中所有测试方法都被跳过。

import sys
import pytest
​
if not sys.platform.startswith("darwin"):
  pytest.skip("如果不是mac,跳过",allow_module_level = True)

注意:如果是在用例中设置allow_module_level为True,并不会跳过模块中剩余的用例

@pytest.mark.skipif

带条件的跳过执行:满足条件就跳过,不满足条件就不跳过

import pytest
​
env = 'iOS'
​
@pytest.mark.skipif('env == "iOS"', reason="iOS不支持")
def test_01():
    pass

当然也可以使用多条标记

import pytest
import sys
​
env = 'iOS1'
​
​
@pytest.mark.skipif('env == "iOS"', reason="iOS不支持")
@pytest.mark.skipif(sys.version_info<(3,12), reason="3.12以下版本不支持")
def test_01():
    pass

可以看到第一个条件不满足,我电脑的版本为3.8,第二个条件满足,最终case跳过。

注意:当一个用例指定了多个skipif条件时,只需满足其中一个,就可以跳过这个用例的执行。

当然也可以在一个文件中定义所有的条件,需要时引入即可

import pytest
import sys
​
version = pytest.mark.skipif(sys.version_info<(3,12), reason="3.12以下版本不支持")
​
@version
def test_01():
    pass

这里不存在pytest.skipif()方法

@pytest.mark.xfail

表示期望这个用例执行失败。用例会正常执行,只是失败时不再显示堆栈信息,最终的结果有两个:用例执行失败(XFAIL:符合预期的失败)、用例执行成功(XPASS:不符合预期的成功)。也就是说执行成功反倒不正确了。

import pytest
​
@pytest.mark.xfail(reason = '预期失败')
def test_01():
    assert 1 == 2

运行结果

test_demo.py::test_01 XFAIL (预期失败)                                   [100%]
@pytest.mark.xfail(reason = '预期失败')
    def test_01():
>       assert 1 == 2
E       assert 1 == 2
​
test_demo.py:5: AssertionError
​

如果断言改成1 != 2,该用例会执行成功,本来标记该功能有bug,但是断言成功了,说明断言或者功能有问题,此时会标记为XPASS

当然也可以增加条件

import pytest
import sys
​
@pytest.mark.xfail(sys.version_info<(3,12), reason = '预期失败')
def test_01():
    assert 1 != 2

如果我们想要将XPASS标记的记为失败,可以使用strict参数

strict为关键字参数,默认值为False。当strict=False时,如果用例执行失败,则结果标记为XFAIL,表示符合预期的失败。如果用例执行成功,则结果标记为XPASS,表示不符合预期的成功。当strict=True时,如果用例执行成功,则结果将标记为FAILED,而不再标记为XPASS。

也可以直接在pytest.ini文件中配置

[pytest]
xfail_strict = true

如果想要将标记为XFAIL的用例不再执行,包含run参数。run为关键字参数,默认值为True。当run=False时,pytest不会再执行测试用例,而直接将结果标记为XFAIL。

import pytest
​
@pytest.mark.xfail(reason = '预期失败', run=False)
def test_01():
    assert 1 == 2

执行发现,会带[NOTRUN]

raises为关键字参数,默认值为None。可以指定为一个异常类或者多个异常类的元组,表明我们期望用例上报指定的异常。pytest.mark.xfail()也可以接收一个raises参数,用来判断用例是否因为一个具体的异常而导致失败

xfail标记如何失效

通过--runxfail参数让xfail标记失效。通过命令行选项pytest --runxfail让xfail标记失效,使这些用例变成正常执行的用例,仿佛没有被标记过一样。同样,pytest.xfail()方法也将失效。

@pytest.mark.parametrize

参数化内容比较多,准备专门写一篇来介绍。

自定义标记

标记用例,在命令行通过-m运行指定标记的用例

test_demo.py

import pytest
​
@pytest.mark.p0
def test_01():
    assert 1 != 2
​
​
@pytest.mark.p1
def test_02():
    assert 1 != 2

运行所有:pytest -v test_demo.py

运行p0pytest -v -m 'p0' test_demo.py

运行p0/p1pytest -v -m 'p0 and p1' test_demo.py

执行后,会发现有警告信息PytestUnknownMarkWarning,你可以忽略。想要解决的话,也可以在配置文件中配置自定义的标记,配置后警告信息会消失。

pytest.ini

[pytest]
markers =
    p0: 冒烟
    p1: 功能

再次执行,会发现已经没有警告信息了。

当然也可以像这样反向运行,运行不是p0的测试用例:pytest -v -m 'not p0' test_demo.py

自定义标记可以通过 pytest_configure(config)钩子 函数在配置阶段添加。下面是一个自定义标记的例子:

def pytest_configure(config):
    config.addinivalue_line(
        'markers',
        'repeat(n): run the given test function `n` times.')
​

在上面的例子中,我们定义了一个自定义标记 repeat,并将其添加到 pytest_configure() 函数中。然后,我们可以在测试函数上使用 @pytest.mark.repeat 标记来标记需要重复执行的测试用例。

最后

通过使用标记,我们可以更灵活地控制测试的行为,并根据需要对不同类型的测试进行分类、过滤和定制化处理。

以上就是深入了解Python中Pytest Markers的使用方法的详细内容,更多关于Python Pytest Markers使用的资料请关注脚本之家其它相关文章!

相关文章

  • Python将Office文档(Word、Excel、PDF、PPT)转为OFD格式的实现方法

    Python将Office文档(Word、Excel、PDF、PPT)转为OFD格式的实现方法

    OFD(Open Fixed-layout Document )是我国自主制定的一种开放版式文件格式标准,如果想要通过Python将Office文档(如Word、Excel或PowerPoint)及PDF文档转换为OFD格式,可以参考本文中提供的实现方法,需要的朋友可以参考下
    2024-06-06
  • 100 个 Python 小例子(练习题二)

    100 个 Python 小例子(练习题二)

    这篇文章主要继续上一篇文章100 个 Python 小例子(练习题一)来完成100 个 Python 小例子,本文包括字母识词、反向输出II、表转字符串、设置输出颜色、算素数等例子,需要的朋友可以参考一下
    2021-10-10
  • Python元组拆包和具名元组解析实例详解

    Python元组拆包和具名元组解析实例详解

    这篇文章主要介绍了Python元组拆包和具名元组解析,下面的内容就围绕元组作为数据记录属性展开,并介绍带字段名的具名元组函数namedtuple,列表属性不再本文中叙述。
    2018-03-03
  • Pytorch基本变量类型FloatTensor与Variable用法

    Pytorch基本变量类型FloatTensor与Variable用法

    今天小编就为大家分享一篇Pytorch基本变量类型FloatTensor与Variable用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python re库的正则表达式入门学习教程

    python re库的正则表达式入门学习教程

    这篇文章主要给大家介绍了关于python re库的正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Python字符串处理的8招秘籍(小结)

    Python字符串处理的8招秘籍(小结)

    这篇文章主要介绍了Python字符串处理的8招秘籍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Python xml、字典、json、类四种数据类型如何实现互相转换

    Python xml、字典、json、类四种数据类型如何实现互相转换

    这篇文章主要介绍了Python xml、字典、json、类四种数据类型如何实现互相转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • python简单实现矩阵的乘,加,转置和逆运算示例

    python简单实现矩阵的乘,加,转置和逆运算示例

    这篇文章主要介绍了python简单实现矩阵的乘,加,转置和逆运算,结合实例形式分析了Python针对矩阵的乘,加,转置和求逆等运算相关实现技巧,需要的朋友可以参考下
    2019-07-07
  • 使用Pandas操作Excel文件的技巧与方法分享

    使用Pandas操作Excel文件的技巧与方法分享

    今天接到一个需求,需要读取excel,将其中两列分别作为字典的key、value进行保存,怎么读取excel呢,之前好像使用过Pandas,但是接触不多,借此机会记录一下学习的收获,需要的朋友可以参考下
    2023-12-12
  • Python之print函数里逗号和加号的区别及说明

    Python之print函数里逗号和加号的区别及说明

    这篇文章主要介绍了Python之print函数里逗号和加号的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02

最新评论