QA之二 -- 测试用例
测试用例 是为了验证某个功能是否正确,提前设计好的一套可执行、有标准答案的测试步骤。
简单说:测试用例 = 测什么 + 怎么测 + 预期应该是什么结果。
一、测什么?
1、语义覆盖
语义覆盖是以「业务语义 / 逻辑规则」为核心的测试覆盖标准,它不只是关注「代码是否被执行」(传统代码覆盖),更关注「代码执行的结果是否符合业务语义规则」。
语义覆盖通常包含哪些内容?
- A. 核心规则覆盖(Business Rules)
- 输入校验规则(合法/非法)
- 权限/角色规则(允许/拒绝)
- 金额/费率/精度/舍入规则(正确性)
- B. 状态机覆盖(State Transitions)
- 关键状态是否能正确流转
- 非法状态流转是否被拒绝
- 重复触发是否幂等(不会重复扣/重复执行)
- C. 异常语义覆盖(Failure Semantics)
- 依赖失败(超时/异常)时
- 是否回滚/补偿
- 是否返回正确错误码
- 是否触发重试/告警
- 不同异常是否区分可重试/不可重试
- 依赖失败(超时/异常)时
- D. 边界与不变量覆盖(Invariants)
- 关键不变量始终成立(例如余额不为负、总和守恒等)
- 边界值:0、最小/最大、临界精度、空集合、null
- E. 并发语义覆盖(Concurrency Semantics)
- 并发重复请求下仍满足幂等与不变量
- 锁/乐观锁冲突后的结果正确
2、测试用例模板
编号、所属模块、标题、重要级别、测试数据、操作步骤、预期结果、测试结果、行覆盖率、分支覆盖率、变异测试得分
- 测试数据:测试输入项和对应的值。
3、按场景举例
- todo
二、怎么测?
-
1、单元测试 - 数量最多,反馈最快
- 覆盖:纯业务逻辑、边界条件、异常分支、状态机
- 特点:不依赖 DB/网络,秒级执行
- 工具:JUnit5 + Mockito + PIT(pitest)
-
2、组件/集成测试 - 少而关键
- 覆盖:DAO/SQL、事务、序列化、外部依赖契约
- 工具:Testcontainners(DB/Redis/Kafka)、SpringBootTest(谨慎用、慢)
-
3、测试用例模板 - 最少但保证主链路
- 覆盖:核心用户流程、发布验收
- 成本高:适合少量关键路径
- 工具:Postman/Newman、pytest、自动化脚本
三、结果如何验证?
-
1、测试结果验证:测试结果是否等于预期结果
- 首先保证功能测通,这是门限。
-
2、JaCoCo代码覆盖率
JaCoCo(Java Code Coverage)是Java/Android 代码覆盖率统计工具,能精准统计测试用例对代码的覆盖程度,生成可视化报告(HTML/XML/CSV)。核心覆盖率指标如下:- 指令覆盖(Instruction):统计字节码指令是否被执行,计算方式:已执行指令数 / 总指令数,达标与之:≥90%,最基础覆盖,仅说明代码 “跑过”;
- 行覆盖(Line):统计源码行是否被执行(核心),已执行行数 / 总行数,≥95%,直观反映源码级覆盖,新手最易理解;
- 分支覆盖(Branch):统计 if/switch 等分支是否全执行,已执行分支数 / 总分支数,≥90%,反映逻辑覆盖度(最关键,比如多签的 “签名数是否足够” 分支);
- 方法覆盖(Method):统计方法是否被调用,已执行方法数 / 总方法数,≥95%,验证核心方法是否被测试;
- 类覆盖(Class):统计类是否有至少一个方法被执行,已执行类数 / 总类数,100%
重点关注:行覆盖率 + 分支覆盖。
-
3、Mutation Testing 变异测试得分
-
Mutation Testing 是什么?
突变测试(也叫 “变异测试”)是评估测试用例有效性的高阶测试方法,核心逻辑:自动在源码中植入微小的 “语法错误”(称为「突变体 Mutant」,比如把 >= 改成 >、把 + 改成 -),然后运行测试用例;如果测试用例能发现这个错误(让突变体被 “杀死”),说明测试用例有效;如果测试用例没发现(突变体 “存活”),说明测试用例遗漏了关键逻辑,需要优化。 -
与 JaCoCo 代码覆盖的核心区别:
代码覆盖是 “做了测试”,突变测试是 “测试做得有效”。 -
Mutation Testing 核心报告指标
-
| 指标名称 | 核心定义 | 计算公式 | 达标阈值(参考) | 关键意义 |
|---|---|---|---|---|
| Mutation Score (MS) | 突变分数:测试用例杀死突变体的能力 | (Killed Mutants / Total Valid Mutants) × 100% | ≥80%(核心业务) | 最核心指标,反映测试用例的有效性 |
| Mutation Coverage | 突变覆盖:测试用例触及突变体的比例 | (Touched Mutants / Total Valid Mutants) × 100% | ≥90% | 反映测试用例是否 “触达” 了突变体(未触及 = 漏测) |
| Killed Mutants | 被杀死的突变体 | 测试用例执行后,检测到突变体并导致测试失败的数量 | 越多越好 | 代表测试用例能发现对应的逻辑错误 |
| Survived Mutants | 存活的突变体 | 测试用例执行后,未检测到突变体(测试仍通过)的数量 | 0(核心逻辑) | 代表测试用例无效,遗漏了关键逻辑 |
| Incompetent Mutants | 无效突变体 | 植入突变后导致源码无法编译 / 运行的数量 | 越少越好 | 工具生成的无效突变(无需关注) |
| Timed Out Mutants | 超时突变体 | 植入突变后测试执行超时的数量 | 越少越好 | 需排查是否是突变体导致性能问题 |
学习技术不是用来写HelloWorld和Demo的,而是要用来解决线上系统的真实问题的.

浙公网安备 33010602011771号