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

详细介绍:python pytest 学习笔记 Day02

深入理解与使用 Pytest 缓存机制

概述:缓存是什么?失败运行管理的原理

Pytest 的缓存机制由 cacheprovider 内置插件提供,主要用途有二:

  1. 记录测试会话状态:自动记录上一次运行的成功/失败用例等信息,用于支持 --lf(只运行失败用例)、--ff(先运行失败用例)等命令行功能。
  2. 跨用例共享数据:通过 cache fixture,允许测试用例有意识地设置和获取缓存值,实现测试间的数据传递(如共享登录 Token)。

缓存目录(默认 .pytest_cache)和文件由 pytest 在首次运行时自动创建和管理。

缓存的应用场景与核心操作

1. 利用会话状态缓存提高效率

这是缓存最常用的功能,旨在快速验证问题。

  • 重新运行上次失败的测试pytest --last-failed (或 --lf
  • 先运行失败用例,再运行其他pytest --failed-first (或 --ff
  • 显示当前缓存内容(不运行测试):pytest --cache-show
  • 清空缓存pytest --cache-clear
  • ​预览测试集合pytest --collect-only

2. 使用 cache Fixture 共享数据

当测试用例间存在依赖时,可以使用 cache fixture 来显式地读写数据。

python
import pytest
def test_login(cache):token = "sample_token_123"# 将 token 存入缓存,key 建议用 '项目名/模块名/变量名' 格式cache.set("my_project/auth/token", token)assert True
def test_access_protected_resource(cache):# 从缓存中获取 token,如果不存在则返回 Nonetoken = cache.get("my_project/auth/token", None)assert token is not None# ... 使用 token 进行后续测试

注意cache.set() 和 cache.get() 的值需要是 JSON 可序列化的类型。

最佳实践与工作流

智能化测试工作流

结合缓存与标记,可以建立高效的工作流。

  1. 快速迭代:只运行上次失败的用例

    pytest --lf -v

  2. 运行核心功能(标记为 'smoke' 的测试)

    pytest -m "smoke" -v

  3. 提交前运行完整套件,但遇到少量失败即停止(避免长时间等待)

    pytest --maxfail=5 -v

测试集合预览:--collect-only参数

核心功能

--collect-only

是 pytest 的诊断和预览参数,它让 pytest 只收集和显示测试用例,而不实际执行任何测试代码。

主要用途​预览测试集合​:查看哪些测试用例会被 pytest 发现和执行

​验证测试筛选​:确认 -k、-m等参数是否正确工作

​调试测试发现​:排查为什么某些测试用例没有被发现

​获取测试统计​:快速了解测试套件的规模和结构

基本用法

基本收集:显示所有测试用例

pytest --collect-only

结合详细模式:显示更详细信息

pytest --collect-only -v

结合缓存功能预览失败测试

pytest --lf --collect-only -v

验证筛选条件

pytest --collect-only -k "login" -vpytest --collect-only -m "smoke" -v

在 CI/CD 中的策略

在持续集成环境中,通常每次会是一个全新的环境,因此缓存可能不持久。但你可以:

  • 使用 pytest --cache-clear 作为流水线第一步,确保测试环境纯净。
  • 主要依赖 cache fixture 来在同一次测试会话的用例间传递数据,而非跨流水线构建。

Pytest 跳过测试用例指南

在 pytest 中跳过测试用例是非常实用的功能,允许您根据特定条件不执行某些测试。以下是几种主要的跳过方法:

1. 无条件跳过测试

使用 @pytest.mark.skip 装饰器可以无条件跳过测试:

import pytest
@pytest.mark.skip(reason="此功能尚未实现")
def test_feature_not_implemented():assert False  # 这个测试不会运行
@pytest.mark.skip("跳过原因:等待外部依赖")
def test_with_external_dependency():# 这个测试也不会运行pass

2. 有条件跳过测试

使用 @pytest.mark.skipif 装饰器可以根据条件跳过测试:

import pytest
import sys
### 根据Python版本跳过
@pytest.mark.skipif(sys.version_info < (3, 8), reason="需要 Python 3.8 或更高版本")
def test_python38_feature():assert True
### 根据操作系统跳过
@pytest.mark.skipif(sys.platform != "win32", reason="仅支持 Windows 平台")
def test_windows_only():assert True
### 自定义条件跳过
IS_CI = os.environ.get('CI') == 'true'
@pytest.mark.skipif(IS_CI, reason="不在CI环境中运行此测试")
def test_local_only():assert True

3. 运行时动态跳过

在测试函数内部使用 pytest.skip() 函数:

def test_dynamic_skip():# 检查某些条件if not some_condition:pytest.skip("条件不满足,跳过测试")# 正常的测试逻辑assert something == expected_value

4. 跳过整个测试模块

在模块顶部使用 pytestmark

import pytest
### 跳过整个模块
pytestmark = pytest.mark.skip("整个模块被跳过")
### 或者有条件跳过整个模块
pytestmark = pytest.mark.skipif(condition, reason="条件跳过整个模块")

5. 跳过类中的所有测试

@pytest.mark.skip(reason="跳过整个测试类")
class TestSkipEntireClass:def test_method1(self):assert False  # 不会运行def test_method2(self):assert False  # 不会运行

6. 预期失败测试(XFail)

虽然不是真正的跳过,但 xfail 用于标记预期会失败的测试:

@pytest.mark.xfail(reason="已知问题,正在修复")
def test_known_bug():assert False  # 预期会失败,但还会运行
@pytest.mark.xfail(condition, reason="条件性预期失败")
def test_conditionally_expected_to_fail():# 某些操作pass

7. 跳过与参数化结合

import pytest
@pytest.mark.parametrize("input_value", [pytest.param(1, id="case_1"),pytest.param(2, id="case_2"),pytest.param(3, marks=pytest.mark.skip(reason="跳过大于2的值")),pytest.param(4, marks=pytest.mark.skip(reason="跳过大于2的值"))
])
def test_with_skip_and_parametrize(input_value):assert input_value <= 2

查看跳过的测试

运行测试时,可以使用 -v 参数查看跳过的测试:

pytest -v

输出会显示: SKIPPED [1] test_file.py:3: 此功能尚未实现

使用 -rs 参数可以查看跳过的详细原因:

pytest -rs

✅ 关键收获

1. 缓存是基础:理解缓存机制是高效使用 pytest 的前提

2. 预览保安全:运行前先用 --collect-only 验证测试范围

3. 跳过得精准:合理跳过测试可以大幅提升执行效率

4. 组合出效果:这些功能组合使用才能发挥最大价值

http://www.zskr.cn/news/55377.html

相关文章:

  • 赛后总结---Codeforces Round 1064 (Div. 2)(虚拟参赛)
  • [豪の算法奇妙冒险] 代码随想录算法训练营第二天 | 209-长度最小的子数组、59-螺旋矩阵II
  • Ubuntu22.04.3安装docker、docker compose
  • 2025 年 11 月上料机厂家推荐排行榜,单工位上料机,双工位上料机,四工位上料机,四工位圆盘上料机,自动化设备,工业自动化设备,工业机器人公司推荐
  • 2025年矩形花键轴企业权威推荐榜单:内花键轴/铣花键轴/精密花键轴源头厂家精选
  • 2025年河北租用服务器公司权威推荐榜单:网站服务器租用/服务器主机租用/阿里云服务器租用源头公司精选
  • Oracle 2025年1月关键补丁更新深度解析
  • 高松灯和大石头的故事
  • 2025 11月 易上手建站工具指南:实用性和难点解决分析
  • 2025年EVA废料优质厂家权威推荐榜单:EVA造粒/EVA颗粒/EVA再生造粒料源头厂家精选
  • 2025 初中一对一教育机构口碑排名:高性价比靠谱名单 + 权威测评排行榜
  • 【PCIE725G 】基于 PCIe x16 总线架构的 JFM9VU9P FPGA 高性能数据预处理平台(100%国产化)
  • 2025年疏浚船优质厂家权威推荐榜单:绞吸船/挖沙船/清淤船源头厂家精选
  • 2025 年 11 月高温老化房厂家推荐排行榜,老化室/高温房/熟化房/固化房/恒温恒湿室/恒温房,专业定制与稳定性能深度解析
  • ORACLE故障恢复:启用与禁用事务的并行恢复
  • Qiling使用速记
  • requests-html在风险管理中的应用:风险数据采集与评估报告 - 详解
  • ai-answer
  • 2025 年 11 月纯化水设备厂家推荐排行榜,生物制药纯化水设备,医疗器械纯化水设备,食品纯化水设备,化妆品纯化水设备,制药纯化水设备公司推荐
  • 火山引擎多模态数据湖,破解智能驾驶数据处理瓶颈
  • 2025年交通安全国际学术会议(ICTS 2025)
  • 国王游戏
  • 11.18题解
  • 视频汇聚平台EasyCVR添加设备提示成功,但平台不展示设备的原因排查
  • 2025年车载精酿啤酒设备实力厂家权威推荐榜单:二手精酿啤酒设备/小型精酿啤酒设备/德国精酿啤酒设备源头厂家精选
  • 小波自适应去噪在脑电信号处理MATLAB仿真实现
  • 2025年胶辊硫化罐直销厂家权威推荐榜单:立式硫化罐/硫化罐密封圈/翻新轮胎硫化罐源头厂家精选
  • 基于STM32微控制器的直流无刷电机(BLDC)控制程序实现
  • 素数与素数筛
  • oop-实验3 - fg