第 1 章 · 初识自动化测试与 pytest
本章目标:理解"自动化测试"到底在测什么,装好 pytest,写出并运行你的第一个测试。
1.1 什么是自动化测试
手工测试是"人打开页面点一遍看结果";自动化测试是把这一套检查写成代码,让机器每次改动后自动重跑。一个测试的本质只有三步:
- 准备(Arrange)——构造输入和依赖;
- 执行(Act)——调用被测代码;
- 断言(Assert)——用
assert检查结果是否符合预期。
为什么选 pytest
pytest 是 Python 生态事实上的标准测试框架:语法极简(普通 assert 即可)、插件生态庞大(400+ 插件)、被 FastAPI / pandas / requests 等主流项目采用。本教程基于当前最新的 pytest 9.x。
1.2 安装与验证
bash
python -m venv .venv && source .venv/bin/activate
pip install pytest验证安装:
bash
pytest --version
# pytest 9.x.x1.3 第一个测试
pytest 对测试文件只有两条约定:
- 文件名必须是
test_*.py或*_test.py; - 测试函数名必须以
test_开头。
创建 test_demo.py:
python
# test_demo.py
def add(a, b):
return a + b
def test_add_two_positive_numbers():
assert add(2, 3) == 5
def test_add_negative_numbers():
assert add(-1, -2) == -3运行:
bash
$ pytest -v
================= test session starts =================
collected 2 items
test_demo.py::test_add_two_positive_numbers PASSED
test_demo.py::test_add_negative_numbers PASSED
================== 2 passed in 0.01s ==================1.4 失败时 pytest 会告诉你什么
故意写一个失败的测试:
python
def test_failed_example():
assert add(2, 2) == 5pytest 的杀手锏是断言重写(assertion rewriting):失败输出不会只给一句 AssertionError,而是把表达式里每个中间值都打印出来:
text
> assert add(2, 2) == 5
E assert 4 == 5
E + where 4 = add(2, 2)where 4 = add(2, 2) 直接告诉了你函数的返回值——这是 unittest 的 self.assertEqual 做不到的体验。
1.5 一个测试应该测什么
初学者最常见的两个误区:
- ❌ 一个测试函数里塞十几个不相关断言(失败时不知道错在哪一步的语义);
- ❌ 为了凑覆盖率去测语言本身(
assert isinstance([], list)毫无价值)。
好的单元测试特征:测行为而不是测实现。比如测 add,你关心的是"两个数相加结果正确",而不是它内部用了 + 还是位运算。
1.6 本章小结
- 自动化测试 = Arrange / Act / Assert 三段式;
- pytest 靠命名约定发现测试:
test_*.py+test_前缀函数; - 普通
assert即可写测试,失败时有断言重写的详细输出; - 测行为,不测实现。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. 以下哪个文件名会被 pytest 默认收集?
2. 在 pytest 中写断言的正确方式是?
3. 测试函数 test_add 运行后输出 "F",代表什么含义?
4. 关于"好的单元测试",下列说法正确的是?
🛠️ 动手实践
- 为本章的
add函数再补充 3 个边界情况测试:零、浮点数、很大的整数。 - 创建一个
strings.py,实现slugify(text)(把空格替换成-并转小写),为它编写至少 3 个测试。 - 故意制造一次测试失败,观察 pytest 输出中的
where ...行,然后改回正确版本。
完成后运行
pytest -v,确保全部通过再进入第 2 章。