我对McCabe 关于这个确切主题的工作的回忆是:您系统地生成基本路径,一次更改一个条件,并且只更改最后一个条件,直到您无法更改任何新条件。
假设我们从最短路径 FF 开始。按照算法,我们更改链中的最后一个 if,产生 FT。我们现在已经介绍了第二个 if,意思是:如果第二个 if 中有 bug,那么我们的两个测试肯定会注意第二个 if 语句突然开始执行时发生的情况,否则我们的测试不工作或我们的代码无法验证。这两种可能性都表明我们的代码需要修改。
覆盖 FT 后,我们返回路径中的一个节点并将第一个 T 更改为 F。在构建基本路径时,我们一次只更改一个条件。所以我们被迫离开第二个,如果相同的话,让步...... TT!
我们剩下这些基本路径:{FF, FT, TT}。哪个解决了您提出的问题。
但是等等,你说,如果错误发生在 TF 案例中怎么办?答案是:我们应该已经在其他三个测试中的两个之间注意到了它。想一想:
- 第二个如果已经有机会通过 FF 和 FT 测试独立地证明它对代码的影响,那么对程序执行的任何其他更改。
- 第一个如果有机会展示其从 FT 到 TT 的独立影响。
我们可以从 TT 案例(最长的路径)开始。我们会得到稍微不同的基础路径,但它们仍然会独立地执行每个 if 语句。
请注意,在您的简单示例中,if 语句的条件没有共线性。共线性削弱了基础路径的生成。
简而言之:系统地进行基础路径测试,避免了您认为的问题。基本路径测试不会告诉您如何编写可验证的代码。(TDD 就是这样做的。)更重要的是,路径测试不会告诉您需要做出哪些断言。那是你作为人类的工作。
资料来源:这是我的研究领域,但几年前我阅读了 McCabe 关于这个确切主题的论文:http: //mccabe.com/pdf/mccabe-nist235r.pdf