pytest第一个测试函数只需创建test_.py文件,定义test_开头的纯函数并用assert断言,无需继承或setup/teardown;失败时自动显示变量值,支持pytest.raises捕获异常、fixture管理资源。

pytest怎么写第一个测试函数
直接在项目里建一个 test_*.py 文件(比如 test_math.py),函数名以 test_ 开头,里面用 assert 判断结果就行。pytest 会自动发现并运行它。
- 不用继承类、不用写
setUp或tearDown—— 没有这些也能跑 -
assert失败时,pytest 会自动展开表达式,比如assert a == b报错会显示a和b的具体值,比unittest的self.assertEqual更直观 - 别在测试函数里 print 日志——默认不输出,加
-s参数才能看到(pytest -s) - 如果函数带参数或用了
yield,pytest 会跳过——只认纯函数
def test_add():
assert 1 + 1 == 2
def test_divide_by_zero():
try:
1 / 0
except ZeroDivisionError:
pass # 这样写没问题,但更推荐用 pytest.raises
如何测试异常和边界情况
用 pytest.raises 捕获预期异常,比手写 try/except 更可靠,还能检查异常类型和消息内容。
- 必须把要触发异常的代码包在
with块里,不能直接调函数后判断——否则异常会中断测试 - 不指定异常类型时,
pytest.raises()会捕获所有异常,容易掩盖真实问题;务必写明类型,比如pytest.raises(ValueError) - 想检查异常信息是否含某字符串?用
match参数:pytest.raises(ValueError, match="must be positive") - 注意:
pytest.raises不支持异步函数,async def 需配合pytest-asyncio插件
def test_invalid_input():
with pytest.raises(ValueError, match="negative"):
process_number(-5)
fixture怎么避免重复 setup/teardown 逻辑
用 @pytest.fixture 定义可复用的测试资源,比如数据库连接、临时文件路径、mock 对象。pytest 自动管理生命周期,比手动写 setup_method 清晰得多。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 默认作用域是函数级(
scope="function"),每个测试函数都拿到新实例;需要跨测试共享?显式设scope="module"或scope="session" - 清理逻辑写在
yield后面,不是finally——yield前是 setup,后面是 teardown - fixture 名字就是参数名,直接当函数参数写进测试函数里,pytest 自动注入,名字拼错就报
Fixture 'xxx' not found - 多个 fixture 有依赖关系?让一个 fixture 接收另一个作为参数即可,pytest 自动解析依赖图
@pytest.fixture
def temp_db():
db = create_test_db()
yield db
db.close()
<p>def test_user_creation(temp_db):
user = temp_db.create_user("alice")
assert user.name == "alice"</p>
运行测试时常见失败原因和排查方向
报错不一定是代码逻辑错,很可能是环境或配置问题。先看错误信息里的关键词,再对应查。
-
ModuleNotFoundError: No module named 'xxx':当前目录没在 Python path 里,运行前加-p no:warnings没用,得用python -m pytest或调整PYTHONPATH -
Fixture 'xxx' not found:拼写错误、fixture 定义不在 scope 内(比如定义在某个 class 里但测试函数在模块顶层)、或者没加@pytest.fixture装饰器 - 测试通过但覆盖率低:pytest 默认不收集
__init__.py或非test_*.py文件,用--cov=src显式指定源码路径 - 本地跑通 CI 上失败:检查
conftest.py是否被 git 忽略、fixture 是否依赖本地环境变量、时间相关断言是否用了datetime.now()(建议 mocktime.time或用freezegun)
测试最难的不是写断言,是设计能稳定重现、不依赖外部状态、且真正覆盖业务意图的场景。fixture 看似简单,但 scope 设错或 yield 位置不对,很容易让测试之间悄悄污染。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










