深入了解 Pytest Markers:提升测试用例的组织和控制能力

2023年 9月 4日 67.1k 0

前言

从这篇开始,逐一解决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

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论