pytest 入门完整指南:3 步跑通你的第一个 Python 测试
【免费下载链接】pytestThe pytest framework makes it easy to write small tests, yet scales to support complex functional testing项目地址: https://gitcode.com/GitHub_Trending/py/pytest
pytest 是面向 Python 的测试框架(test framework):用它一行assert就能写一个测试用例,一条命令就能跑完全部测试,并精确定位失败原因。本文适合想第一次给代码加测试的新手,也适合准备用 pytest 替代内置unittest的普通用户。
为什么值得选 pytest
用内置unittest写测试要继承TestCase、把断言写成assertEqual这类方法名、还要单独处理发现与运行。pytest 直接收集普通函数:只要函数名以test_开头就会被执行;断言失败时它会打印assert 4 == 5这样的两侧取值,还能继续拆解每个值来自哪次调用。另外,@pytest.mark.parametrize标记可以让同一组测试函数用多份参数各跑一遍,不用复制粘贴。
🚀 3 步跑通第一个测试
安装并确认版本
pip install -U pytest pytest --version注意:本仓库声明的运行环境要求 Python 3.10 及以上(见 pyproject.toml 中requires-python)。
建一个最小测试文件
新建test_sample.py,内容如下:
def func(x): return x + 1 def test_answer(): assert func(3) == 5运行并读懂输出
$ pytest collected 1 item test_sample.py F FAILURES > assert func(3) == 5 E assert 4 == 5结果行末尾的F表示该测试失败;E行告诉你两侧实际值。进程退出码也值得记一下:0全部通过,1有失败,5一个测试都没收集到。完整定义见 exit-codes.rst。
🌡️ 小案例:校验华氏温标转摄氏
输入三组"华氏温度 → 期望摄氏温度",期望各生成一条用例;用参数化后你实际得到的是collected 3 items,哪组不对输出里会直接带上具体参数:
import pytest def fahrenheit_to_celsius(f): return (f - 32) * 5 / 9 @pytest.mark.parametrize("f,c", [(32, 0), (212, 100), (98.6, 37)]) def test_conversion(f, c): assert fahrenheit_to_celsius(f) == pytest.approx(c)浮点比较建议用pytest.approx做近似判断,这是官方文档 how-to/parametrize.rst 推荐的做法。
🧩 按需挑选的 4 个插件
- pytest-cov:统计测试覆盖率,回答"哪些代码没被测试碰到"。
- pytest-django:为 Django 项目准备测试数据库和客户端。
- pytest-asyncio:让
async def的异步测试函数能被正常收集执行。 - pytest-xdist:把测试分发到多个进程并行跑,缩短总耗时。
⚠️ 新手 4 个常见坑
- 命名不对就一个用例都收不到:测试文件要以
test_开头(或_test.py结尾),测试函数要以test_开头,否则退出码是5。先跑pytest --collect-only确认收集到了什么,比直接跑快。 - 退出码 5 别慌:先检查当前目录里到底有没有符合条件的
test_*.py文件,再检查函数名。 - 断言改写只作用于测试文件:断言的可读报错依赖对测试模块的改写,不要把测试函数放在其他名字的模块里再 import 进来调用,报错会退化成一堆
assert False。 - 共享资源交给 fixture:数据库连接、临时目录这类"用前准备、用后清理"的资源,用
@pytest.fixture声明并放在conftest.py里,写法见 fixtures.rst。
延伸资源
- 官方文档 Getting Started:从零安装到第一个用例的官方路径
- 参数化测试指南:
parametrize与 fixture 参数化的全部细节 - 退出码说明:7 种退出码的完整定义
- 内置 fixtures 参考:
tmp_path、capsys等现成能力 - 核心实现源码:想看收集、fixture、断言改写怎么实现的,从这里入手
【免费下载链接】pytestThe pytest framework makes it easy to write small tests, yet scales to support complex functional testing项目地址: https://gitcode.com/GitHub_Trending/py/pytest
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考