单元测试基础是什么
单元测试针对代码中最小可测单元(函数、方法、类)验证行为是否符合预期,特点是运行快、隔离依赖、失败即定位到具体函数。工程上推崇先写断言再写实现、一次只验证一个行为的节奏。它是整个测试金字塔的基座:单元测试便宜且稳定,覆盖越高,上层集成与端到端测试才可以更聚焦。
基本信息
| 结构模式 | 准备数据(Arrange)、执行动作(Act)、断言结果(Assert) |
|---|---|
| 隔离手段 | 替身对象:桩、伪造、模拟,隔离网络与数据库等外部依赖 |
| 命名习惯 | 测试名描述场景与预期,如 超过限额时应拒绝提交 |
| 常用框架 | Python 的 pytest 与 unittest,Java 的 JUnit,JavaScript 的 Jest |
| 覆盖视角 | 语句与分支覆盖辅助判断盲区,不当作唯一目标 |
| 运行频率 | 本地保存即跑、提交前必跑、流水线每次构建全量跑 |
pytest 示例
pytest 示例
def calc_discount(total, vip):
if total >= 100:
return 0.9 if vip else 0.95
return 1.0
import pytest
def test_vip_over_100():
assert calc_discount(120, True) == pytest.approx(0.9) # 满额且会员
def test_non_vip_under_100():
assert calc_discount(80, False) == 1.0 # 未满额不打折
# 一个用例验证一个行为,失败时能直接看出哪条规则被破坏典型使用场景
- 新功能开发:先写失败用例再补实现,锁定期望行为。
- 缺陷修复:为每个修复补一条回归用例,防止复发。
- 老代码重构:先补特征测试网,再动手改结构。
- 核心算法:金额、税费、排序等逻辑用密集断言保护。
- 流水线门禁:提交即跑全量单测,快速拦住低级错误。
测行为不测实现:断言公开行为而非内部调用细节,重构时才不会大面积碎测试。
外部依赖要隔离:单测里连数据库或网络会拖慢速度、制造偶发失败。
单元测试不能替代集成测试:模块间契约与真实环境的坑,只有集成层能暴露。
先易后难:给新写的纯函数补单测收益最高,老代码可从缺陷高发模块开始逐步加网。
别用单测给错误实现背书:断言写的是实际结果还是期望结果,评审时要盯住。