分支是指决策的结果,因而分支覆盖可以评测已测试的决策结果。这听起来不错,因为这样可以比语句覆盖更深入地查看源代码,但分支覆盖也会提出更多的要求。
确定方法中的分支数量非常容易。布尔决策无疑只有两种结果:真和假,而开关对于每种情况来说都只有一种结果——别忘了默认情况!方法中的决策结果总数等同于方法中需要覆盖的分支与输入分支的总和。(毕竟,使用直线代码的方法也有一个分支)。
在以上示例中, returnInput() 具有七个分支——三个是真,三个是假,还有一个是用于方法输入的隐藏分支。您可以用两个测试用例来覆盖六个真和假的分支:

图3. 分支覆盖
两个测试都验证了(输出等于输入)需求并且达到了100%的分支覆盖率。但是,尽管实现了100%的分支覆盖率,测试却未发现bug。管理员可能会再次认为测试已完成,该方法可进入生产阶段。
聪明的开发人员将认识到您可能错过了被测试方法中的一些可能路径。以上示例已经测试了 真-假-真或假-真-真 路径,您可以通过添加两个额外测试来进行检验。
该方法中只有三个决策,因此测试所有八种可能路径是非常容易的。但对于包含更多决策的方法来说,可能路径数量将呈指数增长。例如,一个包含十个布尔决策的方法会有1024种可能路径。这样只有祝您好运了!
因此,获得100%的语句和100%的分支覆盖率是远远不够的,但费力地测试一个复杂方法包含的所有可能路径也是不可行的。有没有其他选择呢?让我们看看基本路径覆盖。
路径代表着从开始执行方法到退出方法的执行流程。一个有着N个决策的方法会有 2^N 种可能路径,如果方法中包含一个循环,则会产生无限数量的路径。幸运的是,您可以使用称为 圈复杂度(cyclomatic complexity) 的度量来减少需要测试的路径数量。
一种方法的圈复杂度是数字1加上该方法中的独特决策数量。圈复杂度可以帮助您定义方法的线性无关路径的数量,即基组。线性无关的定义不在本文讨论范围之内,但总体来说基组就是一个最小的路径组,它可以通过组合来创建方法中的其他可能路径。
像分支覆盖一样,路径基组测试确保了您可以测试每个决策结果,但是与分支覆盖不同,基本路径覆盖可以确保对所有相互独立的决策结果进行测试。也就是说每个新的基本路径都可以准确地“浏览”前一个执行决策,而不改变其他执行分支。这是基本路径覆盖比分支覆盖更健壮的重要原因,它使您能够了解如何通过改变一个决策来影响方法的行为。
我将使用同一个示例进行说明。

图4. 代码示例

