Skip to content

第 1 章 · 初识自动化测试与 pytest

本章目标:理解"自动化测试"到底在测什么,装好 pytest,写出并运行你的第一个测试。

1.1 什么是自动化测试

手工测试是"人打开页面点一遍看结果";自动化测试是把这一套检查写成代码,让机器每次改动后自动重跑。一个测试的本质只有三步:

  1. 准备(Arrange)——构造输入和依赖;
  2. 执行(Act)——调用被测代码;
  3. 断言(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.x

1.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) == 5

pytest 的杀手锏是断言重写(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. 关于"好的单元测试",下列说法正确的是?

🛠️ 动手实践

  1. 为本章的 add 函数再补充 3 个边界情况测试:零、浮点数、很大的整数。
  2. 创建一个 strings.py,实现 slugify(text)(把空格替换成 - 并转小写),为它编写至少 3 个测试。
  3. 故意制造一次测试失败,观察 pytest 输出中的 where ... 行,然后改回正确版本。

完成后运行 pytest -v,确保全部通过再进入第 2 章