深入了解Python中Pytest Markers的使用方法
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
运行p0
:pytest -v -m 'p0' test_demo.py
运行p0/p1
:pytest -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中enumerate函数和for循环的对比
在Python编程中,循环是一项常见的任务,而for循环是最常见的一种,然而,Python提供了enumerate函数,它允许在迭代过程中访问元素的同时获得它们的索引,下面我们就来学习一下二者的区别吧2023-11-11python爬虫开发之selenium模块详细使用方法与实例全解
这篇文章主要介绍了python爬虫开发之selenium模块详细使用方法与实例全解,selenium模块详细在爬虫开发中主要用来解决JavaScript渲染问题需要的朋友可以参考下2020-03-03Python源码学习之PyType_Type和PyBaseObject_Type详解
今天给大家带来的是关于Python源码的相关知识学习,文章围绕着PyType_Type和PyBaseObject_Type展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下2021-06-06
最新评论