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