(二)Java中语句、分支和路径覆盖测试

发表于:2007-7-20 11:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Joe Ponczak    来源:IT专家网

#
java
        两个测试都验证了(输出等于输入)需求并且达到了100%的分支覆盖率。但是,尽管实现了100%的分支覆盖率,测试却未发现bug。管理员可能会再次认为测试已完成,该方法可进入生产阶段。

  聪明的开发人员将认识到您可能错过了被测试方法中的一些可能路径。以上示例已经测试了 真-假-真或假-真-真 路径,您可以通过添加两个额外测试来进行检验。

  该方法中只有三个决策,因此测试所有八种可能路径是非常容易的。但对于包含更多决策的方法来说,可能路径数量将呈指数增长。例如,一个包含十个布尔决策的方法会有1024种可能路径。这样只有祝您好运了!

  因此,获得100%的语句和100%的分支覆盖率是远远不够的,但费力地测试一个复杂方法包含的所有可能路径也是不可行的。有没有其他选择呢?让我们看看基本路径覆盖。

  基本路径覆盖

  路径代表着从开始执行方法到退出方法的执行流程。一个有着N个决策的方法会有 2^N 种可能路径,如果方法中包含一个循环,则会产生无限数量的路径。幸运的是,您可以使用称为 圈复杂度(cyclomatic complexity) 的度量来减少需要测试的路径数量。

  一种方法的圈复杂度是数字1加上该方法中的独特决策数量。圈复杂度可以帮助您定义方法的线性无关路径的数量,即基组。线性无关的定义不在本文讨论范围之内,但总体来说基组就是一个最小的路径组,它可以通过组合来创建方法中的其他可能路径。

  像分支覆盖一样,路径基组测试确保了您可以测试每个决策结果,但是与分支覆盖不同,基本路径覆盖可以确保对所有相互独立的决策结果进行测试。也就是说每个新的基本路径都可以准确地“浏览”前一个执行决策,而不改变其他执行分支。这是基本路径覆盖比分支覆盖更健壮的重要原因,它使您能够了解如何通过改变一个决策来影响方法的行为。

  我将使用同一个示例进行说明。

                 

                                          图4. 代码示例

要获得100%的基本路径覆盖,您需要定义基组。这种方法的圈复杂度为四(1加决策数量),需要定义四个线性无关路径。为此,可以将任何第一个路径定为基线,并且逐个浏览决策,直至完成基组。

  •   路径1:任何路径都可以作为基线,因此将决策结果选定为真(由 TTT 表示)。这是基组中的第一个路径。
  •   路径2:要找到下一个基本路径,浏览(仅限于)基线路径中的第一个决策,显示 FTT 表示您期望的决策结果。
  •   路径3:浏览基线路径中的第二个决策,显示第三个基本路径为 TFT 。这样,第一个基线决策就可以保持为结果“真”不变。
  •   路径4:最后,浏览基线路径中的第三个决策,显示第四个基本路径为 TTF 。这样,第一个基线决策就可以保持为结果“真”不变。

  因此,四个基本路径为 TTT、 FTT、 TFT、和 TTF。现在,进行测试并查看结果。

  在所附的代码中,您可以看到 testReturnInputIntBooleanBooleanBooleanTFT() 和 testReturnInputIntBooleanBooleanBooleanFTT() 找到了语句和分支覆盖中未发现的bug。此外,基本路径数量随着决策数据呈线性增长,而非指数增长,使需要进行测试的数量与实现全面分支覆盖所需的数量相等。事实上,基本路径测试覆盖了一个方法中的所有语句和分支,因而有效包含了分支和语句覆盖。

  但是,为何不对其他潜在路径进行测试呢?记住,基本路径测试的目的在于测试所有相对独立的决策结果。通过对四个基本路径的测试可达到这个目的,而这与其他的路径没有关系。如果在开始时选择 FFF 作为基线路径,您将得到(FFF、 TFF、 FTF、 FFT)基组,与 TTT 路径无关。两个基组都同样有效,任何一个都可以满足您的独立决策结果标准。

  创建测试数据

  在本示例中获得100%的基本路径覆盖率非常容易,但是对现实生活中的路径基组进行全面测试将更具挑战性,甚至不可能实现。由于基本路径覆盖测试一个方法中各个决策之间的交互情况,因此您需要使用促使指定路径执行的测试数据,而不能仅仅使用单一的决策结果,这对分支覆盖来说也很有必要。通过注入数据来强行按指定路径执行非常困难,但是您可以记住简化测试过程的几种编码实践。

  使您的代码保持简单。圈复杂度越低越好。在能够减小数值时进行重构。数值越高,就越难测试,这个数值一旦超过10,测试就根本无法实现。这样不仅能减少需要测试的基本路径数量,而且还能减少每个路径中的决策数量。

  •   避免重复决策
  •   避免数据依赖性

  考虑以下示例:

                

                                    图5. 基本路径测试

  x 变量间接依赖于 object1 参数,但其中插入的代码却使查看关系变得尤为困难。随着方法变得越来越复杂,查看方法的输入值和决策表达式之间的关系几乎是不可能的。

  结束语

  尽管语句和分支覆盖度量值易于计算和获得,但都可能留下未知的重大缺陷,只能为开发人员和管理员带来虚假的安全感。基本路径覆盖可以提供更为健壮和全面的方法,从而发现这些未被觉察的缺陷,而且可以避免所需测试的数量呈指数增长。


 

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号