告别断言阻塞!Pytest 原生神器 Subtests 实战教程

简介: Pytest 9.0+ 原生支持 subtests,可在单个测试中运行多个独立子测试:任一失败不中断其余校验,结果聚合展示,动态创建更灵活。告别“断点即终止”,提升多字段/多条件验证效率与可维护性。

在编写自动化测试时,你是否遇到过这种“闹心”事:一个测试用例里需要校验 10 项数据,结果 第 1 项校验失败,整个用例就直接报错跳出了。剩下的 9 项到底对不对?不知道,得改完第一个再测。

以前我们要么忍受这种低效,要么写一堆复杂的 @pytest.mark.parametrize。但现在,Pytest 9.0+ 已经原生内置了 subtests 功能!它能让你在一个用例里跑多个“子测试”,互不干扰。

  1. 什么是 Subtests?
    subtests 是一种逻辑上的“用例分组”。它允许你在一个测试函数内部,运行多个独立的断言块。

核心特性:

独立执行:某个子测试失败,后续的子测试依然会继续执行。
聚合报告:在一个测试用例下汇总所有失败点。
动态生成:支持在循环或逻辑分支中动态创建,比参数化更灵活。

  1. 使用示例
    使用 subtests 无需安装额外插件(Pytest 9.0+),直接在函数参数中引入同名 fixture 即可。

基础代码示例
假设我们要测试一个接口返回的多个字段,不希望因为 name 错了就导致没测 age。

import pytest

def test_user_data_logic(subtests):
user_info = {
"name": "hogwarts",
"age": 18,
"email": "invalid-email", # 假设这是个错误数据
"status": "active"
}

for key, value in user_info.items():
    # 使用 with 语句开启子测试
    # msg: 自定义描述信息;后面可以跟任意数量的关键字参数(如 field=key)用于标识数据
    with subtests.test(msg=f"校验字段: {key}", field=key):
        if key == "email":
            assert"@"in value
        elif key == "age":
            assert value >= 18
        else:
            assert value isnotNone

运行效果展示
当你运行上面的代码,你会看到类似下方的输出:

__ test_user_data_logic [校验字段: email] __
subtests = <_pytest.subtests.Subtests object at 0x...>
def test_user_data_logic(subtests):
...

assert "@" in value
E AssertionError: assert '@' in 'invalid-email'

__ test_user_datalogic __
contains 1 failed subtest
========================= short test summary info =========================
FAILED test_demo.py::test_user_data_logic - contains 1 failed subtest

即使 email 校验失败了,status 的校验依然被执行了,报告会清晰地告诉你哪个子测试(msg 或 field)出了问题。

  1. 深度对比:Subtests vs 参数化
    很多小伙伴会纠结:我用 @pytest.mark.parametrize 不也能达到类似效果吗?

维度
参数化 (Parametrize)
子测试 (Subtests)
定义时机 测试采集阶段
(运行前确定)
测试执行阶段
(运行时动态决定)
独立性
视为多个完全独立的用例
视为一个用例里的多个环节
性能/Setup
每个参数重新触发 setup/teardown
共享同一个 setup/teardown(更省资源)
控制力
可通过命令行 -k 筛选单个参数运行
只能整体运行,无法单独筛选子项

  1. 进阶技巧
    A. 控制详细输出
    默认情况下,Pytest 只显示失败的子测试。如果你想在控制台看到所有(包括成功)的子测试进度,请使用 -v 参数:pytest -v test_demo.py

B. 类型提示 (Typing)
如果你追求代码规范,可以为 subtests 加上类型注解,方便 IDE 进行补全:

import pytest

def test_with_typing(subtests: pytest.Subtests):
with subtests.test():
assert True
C. 旧版本兼容
如果你还在用 Pytest 8.x 或更早的版本,只需要手动安装插件即可拥有同样功能:pip install pytest-subtests

  1. 避坑指南 & 最佳实践
    不要滥用:不要把整个系统的测试都塞进一个函数里。Subtests 应该用于校验同一逻辑实体的不同属性。
    异常处理:如果代码在 with subtests.test(): 块之外抛出了异常(比如数据库连接失败),测试依然会立刻终止。
    数据隔离:由于所有子测试共享同一个测试函数的作用域,注意不要让上一个子测试修改了下一个子测试要用的变量。
    结语
    subtests 的引入补全了 Pytest 在“细粒度断言”上的短板。它既保留了单个用例的简洁,又提供了多点校验的韧性。

你觉得这个功能好用吗?或者在实际项目中遇到了哪些坑?欢迎在评论区交流讨论! 🚀

关于我们
霍格沃兹测试开发学社,隶属于 测吧(北京)科技有限公司,是一个面向软件测试爱好者的技术交流社区。

学社围绕现代软件测试工程体系展开,内容涵盖软件测试入门、自动化测试、性能测试、接口测试、测试开发、全栈测试,以及人工智能测试与 AI 在测试工程中的应用实践。

我们关注测试工程能力的系统化建设,包括 Python 自动化测试、Java 自动化测试、Web 与 App 自动化、持续集成与质量体系建设,同时探索 AI 驱动的测试设计、用例生成、自动化执行与质量分析方法,沉淀可复用、可落地的测试开发工程经验。

在技术社区与工程实践之外,学社还参与测试工程人才培养体系建设,面向高校提供测试实训平台与实践支持,组织开展 “火焰杯” 软件测试相关技术赛事,并探索以能力为导向的人才培养模式,包括高校学员先学习、就业后付款的实践路径。

同时,学社结合真实行业需求,为在职测试工程师与高潜学员提供名企大厂 1v1 私教服务,用于个性化能力提升与工程实践指导。

相关文章
|
20天前
|
人工智能 JavaScript 测试技术
Playwright扩展开发:自定义插件与工具创建
本文详解如何为Playwright开发自定义插件与工具:涵盖登录状态管理Fixture、Slack通知Reporter、POM插件及CLI命令行工具,助力解决重复代码、业务封装、第三方集成等实际痛点,提升测试复用性、可维护性与工程效能。
|
2天前
|
机器学习/深度学习 人工智能 资源调度
万亿参数、混合线性架构、开源免费——Ring-2.5-1T 来了,思考模型卷到新高度
蚂蚁inclusionAI发布开源万亿参数思考模型Ring-2.5-1T,首创混合线性注意力架构,实现“快、深、长”三大突破:推理吞吐提升3倍+,IMO/CMO达金牌水平,可在Claude Code中连续2小时开发可运行的迷你操作系统。MIT协议完全开源。
115 21
万亿参数、混合线性架构、开源免费——Ring-2.5-1T 来了,思考模型卷到新高度
|
1月前
|
数据采集 人工智能 IDE
告别碎片化日志:一套方案采集所有主流 AI 编程工具
本文介绍了一套基于MCP架构的轻量化、多AI工具代码采集方案,支持CLI、IDE等多类工具,实现用户无感、可扩展的数据采集,已对接Aone日志平台,助力AI代码采纳率分析与研发效能提升。
473 46
告别碎片化日志:一套方案采集所有主流 AI 编程工具
|
2天前
|
机器学习/深度学习 JSON 安全
基于品牌冒充的钓鱼攻击演化趋势与多维防御机制研究——以 Microsoft、Facebook、Roblox 为例
2025年Q4全球钓鱼攻击呈品牌集中化趋势:Microsoft首超Facebook成被冒充最多品牌,Roblox跻身第三。本文深度剖析三者技术实现、心理诱导机制与用户特征,复现钓鱼页面代码逻辑,并提出融合AI识别、FIDO2强认证与差异化安全培训的多维防御体系。(239字)
59 17
|
14天前
|
缓存 人工智能 自然语言处理
企业级编程助手避坑指南:数月躬身摸索,凝炼实操进阶巧思
在软件开发向团队化、工程化进阶的当下,企业级编程助手已不再是单纯的AI编码辅助载体,而是成为覆盖需求→设计→开发→Review全流程的研发基础设施。它依托多模型适配引擎与规范驱动开发体系,融合静态代码分析、环境隔离等核心技术,能实现自然语言任务驱动、自动化代码评审、多端协同开发等功能,帮助研发团队减少重复劳动、提升工程质量。本文结合几个月来的实际使用经历,分享编程助手的实操技巧、实际应用案例及使用心得,旨在为同行提供可落地的实践经验,规避使用误区。
|
20天前
|
人工智能 安全 数据可视化
OpenClaw(Clawdbot/Moltbot)AI 助手一键部署保姆级教程及2026年常见问题解答
2026年,OpenClaw凭借强大的任务执行能力与开源特性,成为搭建专属AI助手的首选工具,其前身为Clawdbot、Moltbot,历经版本迭代优化,部署流程更简洁、兼容性更出色。阿里云针对不同用户群体,推出了OpenClaw专属一键部署方案,通过预置应用镜像、简化配置流程,实现“分钟级部署、零代码上手”,彻底打破了开源工具的技术门槛,无论是零基础新手还是有一定基础的用户,都能轻松搭建7×24小时在线的AI助手。
364 14
|
2天前
|
安全 网络协议 搜索推荐
APT42短链钓鱼攻击机制与移动终端防御研究
本文分析伊朗APT42组织利用WhatsApp和msnl.lnk等短链服务对以色列防务目标实施鱼叉式钓鱼攻击的技术链,揭示其通过短链重定向、伪造登录页、动态DNS轮换等手段规避检测的战术,并提出融合威胁情报、移动终端管控与用户教育的纵深防御体系。(239字)
86 24
|
15天前
|
数据采集 人工智能 安全
别再用ChatGPT群发祝福了!30分钟微调一个懂你关系的“人情味”拜年AI
春节祝福太难写?本文手把手教你用LoRA微调大模型,让AI学会“看人下菜”:识别关系、风格、细节,30分钟训练出懂人情世故的拜年助手。无需代码,量化+批处理保障秒级响应,让每条祝福都像你亲手写的。(239字)
259 35
|
27天前
|
人工智能 关系型数据库 Serverless
2 天,用函数计算 AgentRun 爆改一副赛博朋克眼镜
2 天将吃灰的 Meta 眼镜改造成“交警Copilot”:通过阿里云函数计算 AgentRun 实现端-管-云协同,利用 Prompt 驱动交通规则判断,结合 OCR 与数据库查询,打造可动态扩展的智能执法原型,展现 Agent 架构在真实场景中的灵活与高效。
346 44
|
28天前
|
机器学习/深度学习 人工智能 自然语言处理
模型训练篇|多阶段ToolRL打造更可靠的AI导购助手
芝麻租赁推出AI导购“租赁小不懂”,针对长周期、重决策租赁场景,首创“One-Model + Tool-Use”架构与两阶段强化学习,攻克需求难匹配、决策效率低、服务被动三大痛点,实现响应提速78%、推荐成功率提升14.93%,打造贴切、沉浸、信任的场景化租赁体验。(239字)
191 25
模型训练篇|多阶段ToolRL打造更可靠的AI导购助手

热门文章

最新文章