
pytest 是 Python 测试生态中最主流的测试框架,上手快、功能强,但新手常在断言、参数化、fixture 作用域、跳过与预期失败等地方踩坑。下面整理几个高频问题及对应解法。
断言失败时信息不清晰?用 pytest 的原生 assert 就够了
很多人习惯写 self.assertEqual(a, b)(来自 unittest),但在 pytest 中直接用 assert a == b 即可。pytest 会自动重写 assert 语句,在失败时展示变量实际值、表达式结构和上下文,比传统断言更直观。
例如:
❌ 错误写法(冗余且信息少):
立即学习“Python免费学习笔记(深入)”;
import unittest<br>class TestMath(unittest.TestCase):<br> def test_add(self):<br> self.assertEqual(2 + 2, 5) # 失败只报 "Expected 5, got 4"
✅ 正确写法(推荐):
def test_add():<br> assert 2 + 2 == 5 # 失败显示:AssertionError: assert 4 == 5
如果需自定义失败消息,可加 msg 参数:
assert result == expected, f"计算错误:期望 {expected},得到 {result}"- 避免用
assert x is True,改用assert x;同理assert x is False→assert not x
参数化测试数据重复、结构混乱?用 @pytest.mark.parametrize 清晰组织
常见误区是把多组输入硬编码成多个函数,或用 for 循环内嵌断言——这会导致单个失败就中断全部,且 pytest 无法识别为独立用例。
抖猫高清去水印微信小程序,源码为短视频去水印微信小程序全套源码,包含微信小程序端源码,服务端后台源码,支持某音、某手、某书、某站短视频平台去水印,提供全套的源码,实现功能包括:1、小程序登录授权、获取微信头像、获取微信用户2、首页包括:流量主已经对接、去水印连接解析、去水印操作指导、常见问题指引3、常用工具箱:包括视频镜头分割(可自定义时长分割)、智能分割(根据镜头自动分割)、视频混剪、模糊图片高
正确方式是用 @pytest.mark.parametrize 声明多组参数,每组生成一个独立测试项:
import pytest<br><br>@pytest.mark.parametrize("x, y, expected", [<br> (1, 2, 3),<br> (0, 0, 0),<br> (-1, 1, 0),<br>])<br>def test_add(x, y, expected):<br> assert x + y == expected小技巧:
- 参数名用字符串,逗号分隔,顺序必须与元组/列表中值一一对应
- 支持嵌套结构,如
@pytest.mark.parametrize("case", [Case(1,2,3), Case(0,0,0)]),再在函数中解包 - 加
ids参数让输出更易读:ids=["positive", "zero", "negative"]
fixture 初始化/清理逻辑没执行?检查作用域和调用方式
fixture 不是装饰器,不能像 @pytest.fixture 那样直接加在测试函数上运行。它需要被函数参数显式声明,pytest 才会自动注入并管理生命周期。
典型错误:
- 写了
@pytest.fixture,但测试函数没写对应参数名 → fixture 根本不触发 - 在 fixture 内用了
yield,但忘记加scope="function"或其他作用域,导致清理逻辑未执行 - 多个 fixture 有依赖,但参数顺序写反,引发初始化失败
正确示例(带清理):
@pytest.fixture<br>def temp_file():<br> f = open("test.tmp", "w")<br> yield f<br> f.close()<br> os.remove("test.tmp") # 清理总被执行注意:
- 默认作用域是
"function",即每个测试函数单独执行一次 - 若需跨测试共享(如数据库连接),设
scope="session",但要确保线程/进程安全 - fixture 名即参数名,大小写和下划线必须完全一致
想跳过某个测试,或标记“应该失败”?用内置标记精准控制
pytest 提供了轻量级标记机制,无需修改逻辑即可控制执行行为:
-
@pytest.mark.skip(reason="暂不支持"):无条件跳过,报告中标为s @pytest.mark.skipif(sys.version_info :满足条件时跳过-
@pytest.mark.xfail(reason="已知 bug,修复后移除此标记"):预期失败。若它意外通过,报告标为xpass(可加strict=True让 xpass 变成失败)
补充说明:
- 所有标记都需在测试函数上方,紧邻函数定义
- 可在命令行按标记筛选运行:
pytest -m "not slow"或pytest -m xfail - 自定义标记需在
pytest.ini中注册,否则运行时报 warning









