当前位置: 首页 > news >正文

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

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

可以看到第一个条件不满足,我电脑的版本为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标记来标记需要重复执行的测试用例。

最后

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

最后:下方这份完整的软件测试 视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

http://www.jsqmd.com/news/695230/

相关文章:

  • WordPress后台插件隐藏策略:仅对指定管理员显示特定插件
  • 基于uniapp+springboot的校园失物招领系统的设计与实现(文档+源码)_kaic
  • 2026年当下江苏电力建设优选:天宏电力科技变压器直销实力解析 - 2026年企业推荐榜
  • 专知智库发布全球首个《地理标志资产成熟度认证白皮书》——三维生态模型破解“重注册、轻运营”困境,五级成熟度等级激活区域特色经济新动能
  • Amlogic S9xxx盒子无线网卡终极适配指南:5分钟搞定RTL8822CS驱动
  • 洞见2026年4月GEO营销趋势:顶尖服务商深度解析与联系指南 - 2026年企业推荐榜
  • 别只刷LeetCode了!嵌入式软件面试,这3个C语言‘冷门’考点才是区分高手的关键
  • TCP SYN路由追踪架构实现原理与技术分析
  • SAP S/4HANA 2022 实战:手把手教你配置AIC-SO高级公司间销售,告别传统流程的合规烦恼
  • 专知智库发布全球首个《软件资产成熟度认证白皮书》——三维生态模型破解“重功能、轻质量”困境,五级成熟度等级定义软件资产新标尺
  • 如何在5分钟内为Windows 11 LTSC 24H2恢复微软商店:完整功能恢复指南
  • 70D:织带原料、运动服饰纱线、运动袜专用锦纶彩色高弹丝、运动袜原料、运动袜系列专用涤纶纱线、远动袜专用尼龙纱线选择指南 - 优质品牌商家
  • 黑苹果休眠问题终极解决方案:3步诊断与5大修复技巧
  • 3步掌握Heightmapper:免费生成专业地形高度图的神器
  • **解析:2026年4月洛阳职业技校怎么选?深度**洛阳机车高级技工学校 - 2026年企业推荐榜
  • 自动化回归测试平台 AREX 的 Mock 实现原理
  • 用手机热点和网络调试助手,5分钟搞定ESP8266模块的TCP通信测试
  • MCP协议实战:从零搭建一个让Claude能“看见“数据库的工具服务
  • 2026年当下河南工业机器人人才培训优选:聚焦金伙伴教育 - 2026年企业推荐榜
  • Qclaw:一键唤醒你的音乐MV导演天赋
  • 5大革新功能:WarcraftHelper的现代游戏兼容性完全指南
  • 4月25日成都地区重钢产热轧卷(Q355B;厚度5.75-15.75mm)今日价格 - 四川盛世钢联营销中心
  • NVIDIA Isaac Sim 5.0与Isaac Lab 2.2:机器人仿真与训练技术解析
  • 2026年宁波环氧地坪选择指南:以浙江景福祥建筑涂装有限公司为例 - 2026年企业推荐榜
  • 汽车电子工程师必看:LIN总线硬件设计中的EMI控制与压摆率实战调优
  • 5分钟掌握AI图像分层:layerdivider终极实战指南
  • DeepSeek V4预览版震撼开源:五大技术亮点全面解析
  • 2026年现阶段一笔空心字书法艺术深度解析与**推荐 - 2026年企业推荐榜
  • ExplorerPatcher完整指南:5分钟让Windows 11回归经典界面,告别不适应!
  • 光子脉冲神经网络硬件协同设计与能效优化