如何误用代码覆盖(一)

发表于:2008-11-03 14:25

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

 作者:译者:贾国莹    来源:51Testing投稿

  代码覆盖工具是用来测量如何彻底地测试执行程序的。我相信它们被误用的场合要多于正确使用的场合。本文旨在详细描述通常所出现的误用情况,然后讨论一种特殊的较为严谨的运用覆盖的方法。

  还有其他的方法来衡量测试的彻底性。请参看文献【Kaner96】。这些方法都适合于评价“测试覆盖”。而在本文中我所要阐明的是具体的代码覆盖。

  为避免冗长的“代码覆盖”词组的重复使用,我将遵循通常的做法使用简写“覆盖”,我将偶尔使用全称以提醒大家文章所讨论的范围。

  就像代码覆盖自身一样,本文旨在在程序员测试他们自己编写的代码,或者在测试过程中测试人员读取源代码时有所帮助。本文同样描述了覆盖与独立的产品测试人员(不研究代码的某些人),开发经理和测试人员之间的关联关系。

  什么是代码覆盖

  有很多不同的衡量覆盖的方法。最简单的一种的方法就是记录哪一行代码被执行了。如果某一行代码没有被执行,我敢百分之百的确信你没有找到隐藏在该程序中的任何错误。这种类型的覆盖通常被称为“陈述覆盖”。

  在本文中,我将使用一种稍微更有效的覆盖类型。很多商业化的工具可以用来测量一些该类覆盖的变种。很少有工具可以更有效的测量所有的覆盖类型。不同的人对这种类型的覆盖使用不同的称呼:“代码段覆盖”,“多条件覆盖”,“分支覆盖”(按理说是不正确地),等等。我称之为“多条件覆盖”。

  它测试代码中的每一个逻辑条件的真值和非真值是否均执行过(在有些程序的执行过程中,并不要求都要执行)。假设你的代码是这样的: 

  if (x < 0)

   do something...

   if (y < 3 && z <= x)

   do something else

  为了测试它的覆盖情况你首先必须要执行它。覆盖工具将会修改这些代码来记录哪些表达式是通过什么方式评估的。所做的修改要么位于原代码上要么位于编译器生成的可执行结果上。如果是在原代码上,大多数工具都不会改变原代码,相反,它们会修改一个原件的副本,然后让这个副本通过编译器的执行,就好像是原件通过了编译器的执行一样。在执行代码以后,你要运行一些测试,将累积的覆盖结果写到一些日志上。查看日志,你可能会看到下面这样的说明:

   sourcefile.c, line 33: branch was never taken true. (分支没有发生正确值)

   sourcefile.c, line 36: the second expression (z<=x) has never evaluated false(.第二个表达式(z<=x)没有评估非真值)

  第一行告诉你没有测试能使第一个if语句中的条件x<0执行。第二个行告诉你在第二个if语句中z没有大于x。事实上,使用一个典型的覆盖工具进行分析,其产生的日志无法说明在第二个if语句中,第一个逻辑表达式y<3为真值至少发生一次,以及为非真值至少发生一次。

版权声明:51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像。51Testing软件测试网欢迎与业内同行进行有益的合作和交流,如果有任何有关内容方面的合作事宜,请联系我们

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号