单元测试用例应基于详细设计文档和实际代码逻辑生成,避免脱离实现凭空设计。通常按以下方式执行:
1. 用例来源
- 接口契约:函数/方法的输入参数、返回值、异常声明。
- 代码逻辑:通过静态阅读或工具扫描识别分支、循环、边界条件。
- 需求规则:对核心业务规则(如计费、校验、状态转换)补充场景。
2. 设计方法
优先采用组合策略,避免过度设计:
- 等价类划分 + 边界值:覆盖正常输入、临界值、非法值(如空字符串、负数、最大值)。
- 路径覆盖:针对
if/else、switch、try/catch等多分支逻辑,确保每个分支至少执行一次;对核心算法要求条件覆盖。 - 异常注入:主动构造空指针、类型错误、资源失败等异常路径。
3. 用例要素
每条用例须明确:
- 标识:模块名_被测函数_场景,例:
test_order_apply_discount_expired_coupon - 前置条件:Mock 对象初始化、依赖桩数据设置。
- 输入数据:具体的参数值或状态上下文。
- 预期结果:精确的返回值、对象状态变更或抛出的异常类型。
- 清理动作:释放资源、重置静态状态,确保用例间无依赖。
4. 覆盖标准
- 语句覆盖率达到 100%。
- 分支覆盖率不低于 80%;复杂计算逻辑须达到 100%。
- 对无法覆盖的防御性代码段,须在测试报告中注明原因。
5. 实践要求
- 单一职责:一个用例只验证一个判定条件,避免多断言堆叠。
- 可重复执行:禁止依赖真实外部服务(数据库、缓存、第三方接口),一律使用 Mock/Stub。
- 自动化友好:测试代码与产品代码同仓库维护,命名遵循框架规范(如 JUnit 的
testXxx或 pytest 的test_xxx),确保可随 CI 流水线自动运行。
示例:对函数
calculateFee(int distance),至少生成 3 条用例:
-distance = 1(起步价区间,验证基础费用)
-distance = 10(临界值,验证阶梯计价切换)
-distance = -1(非法输入,验证抛出IllegalArgumentException)