pytest其他功能Marks、断言、插件、缓存机制

1.标记机制(Marks)------ 用例的"筛选器"和"标签"

这是你项目中还没用到,但大项目必备的功能。它允许你给用例打标签,实现分组执行(比如只跑冒烟测试)。

用法:@pytest.mark.smoke(冒烟)、@pytest.mark.regression(回归)、@pytest.mark.P0(优先级)。

实战场景:你写了 500 个接口用例,发版前只想跑核心的 20 个冒烟用例。你只需在冒烟用例上加 @pytest.mark.smoke,然后执行 pytest -m smoke,Pytest 就会自动过滤,只跑这 20 个。

内置特殊标记(面试高频):

@pytest.mark.skip:无条件跳过该用例(比如某个接口还在开发中)。

@pytest.mark.xfail:预期该用例会失败(比如已知 Bug,先标记上去,失败了不算额外报错,不影响整体通过率)。

@pytest.mark.usefixtures:在类或模块级别,批量引入 Fixture,省去每个函数都传参的麻烦。

2. 断言重写(Assertion Rewriting)------ 你的"智能调试助手"

这是 Pytest 区别于 unittest 的最大杀手锏。

原理:Pytest 会在运行前对 assert 语句做"字节码劫持"。当断言失败时,它自动拆解变量的值,并展示在报错信息里。

对比体验:

普通 Python:报错 AssertionError,你完全不知道变量当时是什么值。

Pytest:报错 AssertionError: assert 500 == 200,甚至 assert {'code':1} == {'code':0} 时,它会精确告诉你哪个键的值不一样。

实战价值:你在 Assertions 类里写 assert actual == expected 时,完全不需要拼接报错字符串,Pytest 会帮你把现场还原得极其清楚,极大节省了调试时间。

3. 插件系统(Hooks & Plugins)------ 无限扩展的"乐高积木"

Pytest 最伟大的设计就是极其开放的插件架构。你之前看到的 conftest.py 里的钩子函数,就是插件系统的地基。

除了自定义钩子,Pytest 生态里有三大"神器"插件(面试时提一嘴,显得你有全局视野):

pytest-xdist:分布式并发执行。如果你有 500 个接口用例,串行跑要 10 分钟,用这个插件配合 -n auto 参数,可以开启 4 个进程并行跑,时间直接缩短到 3 分钟。(这是解决"用例太多跑得慢"的终极方案)

pytest-html / pytest-tmreport:生成独立的 HTML 报告(你项目中 tmreport 分支用的就是这个原理)。

pytest-rerunfailures:失败重跑机制。有些接口偶尔超时(Flaky Test),你可以设置 --reruns 2,遇到失败自动重跑 2 次,避免因为网络抖动导致的"误报"。

4. 缓存机制(Cache)------ 记住你的"上次失败"

Pytest 在运行时会自动在 .pytest_cache 目录下记录状态。这个功能配合命令行参数,极其好用:

--lf(--last-failed):只重新运行上次失败的用例。比如你跑了 100 个用例,有 3 个失败了,你修完代码后,执行 pytest --lf,它只会跑那 3 个失败用例,不用全量跑,极大缩短开发自测的反馈周期。

--ff(--failed-first):先跑上次失败的用例,再跑其他的。适合在 CI/CD 流水线中,让最重要的失败信息第一时间暴露出来。