代码覆盖率被广泛当作测试质量的指标,但它只回答“哪些代码被执行过”。这篇用同一份代码上的三套测试,量出覆盖率、分支覆盖与变异测试得分的差别:覆盖率最高的测试可以一个 bug 都发现不了。
[NoAssertTest:没有任何断言的测试(只是调用了所有方法)] 通过 1、失败 0
Pricing:行覆盖 88%(7/8),分支覆盖 100%(18/18),指令覆盖 96%;Dto:行覆盖 100%,方法覆盖 100%
Pricing 的变异测试:共 26 个变异,被杀死 0 个(得分 0%),存活 26 个,没有覆盖 0 个
[ThinTest:只有 2 个断言的薄测试] 通过 2、失败 0
Pricing:行覆盖 75%(6/8),分支覆盖 33%(6/18),指令覆盖 49%;Dto:行覆盖 0%,方法覆盖 0%
Pricing 的变异测试:共 26 个变异,被杀死 9 个(得分 35%),存活 5 个,没有覆盖 12 个
[RealTest:为每个分支与边界写了断言的测试] 通过 9、失败 0
Pricing:行覆盖 88%(7/8),分支覆盖 100%(18/18),指令覆盖 96%;Dto:行覆盖 50%,方法覆盖 18%
Pricing 的变异测试:共 26 个变异,被杀死 26 个(得分 100%),存活 0 个,没有覆盖 0 个[ThinTest] 方法 tier(a, b):行 覆盖 1 / 遗漏 0;分支 覆盖 2 / 遗漏 2(a > 0 与 b > 0 各 2 个分支,共 4 个) [RealTest] 方法 tier(a, b):行 覆盖 1 / 遗漏 0;分支 覆盖 4 / 遗漏 0(a > 0 与 b > 0 各 2 个分支,共 4 个)
[NoAssertTest] SURVIVED 26 个
SURVIVED:ConditionalsBoundaryMutator 第 4 行, ConditionalsBoundaryMutator 第 5 行, MathMutator 第 3 行, MathMutator 第 4 行, MathMutator 第 5 行, MathMutator 第 6 行 …
[RealTest] KILLED 26 个没有 agent 的中位数 547 ms;有 JaCoCo agent(includes=Spin)的中位数 565 ms,慢 1.03 倍