关闭

单元测试彻底测试的方法

发表于:2010-11-24 10:33

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

 作者:未知    来源:51Testing软件测试网采编

  要找出所有等价类,关键是要有衡量完整性的指标。等价类实际上就是程序的功能点,程序的功能是人为规定的,很难衡量完整性,但白盒测试却很容易衡量完整性,因此,我们可以考虑使用白盒测试的覆盖率来衡量测试完整性。

  看一下这个简单的例子:

void Func(int* p)
{
if(p)
{
*p = 0;
}
else
{
return;
}
}

  参数p是一个指针,测试时当然要将空指针作为一个等价类,如果漏了这个等价类,会怎么样呢?分支覆盖会不完整:else分支未覆盖。从这个例子可以看出,未覆盖的逻辑单位通常对应未测试的等价类,因此,白盒覆盖可以衡量等价类是否完整。

  还是上面的例子,假如程序员完全忘了有空指针这回事,把代码写成这样:

void Func(int* p)
{
*p = 0;
}

  由于判断p是否为空指针的代码不存在,白盒覆盖当然不会提示说“某某代码或某某分支未覆盖”,因此,白盒覆盖不能发现“程序员未处理某些特殊输入”这种情形,也就是说,即便达到了无与伦比的白盒覆盖率,仍然不能保证找出所有等价类。

  程序员会忘记处理哪些输入呢?常见的输入一般是不会记的,否则程序的起码功能都未实现,容易忘记的是一些“偏僻”的输入,例如,空指针、空字符串、很大的数、很小的数、合法取值边界附近的值等等,从输入的角度来看,这些特殊值通常跟数据类型有关,从程序的行为来看,这些特殊输入常常会导致崩溃、产生异常,或超时,即具有行为特征,正好是自动动态测试可以发现的,因此,我们可以利用自动动态测试来捕捉“程序员未处理某些特殊输入”形成的错误。

  4、彻底测试方法

  基于上一节的思路,经过长时间摸索和改进,我们提出了实现彻底测试的“三步法”:

  1)根据代码的功能,人工设计测试用例进行基本功能测试;

  2)统计白盒覆盖率,为未覆盖的白盒单位设计测试用例,实现完整的白盒覆盖,比较理想的覆盖率是实现100%语句、条件、分支、路径覆盖;

  3)自动生成大量的测试用例,捕捉“程序员未处理某些特殊输入”形成的错误。

  第1步的测试用例通常是现成的,因为详细设计文档会规定程序的基本功能,没有文档的,程序员在编程时也要想清楚程序的功能,这些基本功能就是基本测试用例;

  第2步是在第1步的基础上,检查未覆盖的白盒单位,由于未覆盖的逻辑单位通常对应未测试的等价类,因此第2步可以找出第1步所遗漏的测试用例;

  第3步用自动动态测试弥补第2步的固有缺陷。

  “三步法”尽量避免重复工作,白盒方法和黑盒方法相结合,人工方法和自动方法相补充,如果第2步的覆盖率比较理想,那么基本上可以保证找出所有等价类。在开发过程允许的限度内,“三步法”已接近极限,当得起“彻底测试”四个字。

  5、是否需要其他测试?

  “三步法”使用了人工动态测试和自动动态测试,未使用人工静态分析和自动静态分析,要不要再使用这两种方法呢?这就要看合不合算了,毕竟项目时间和预算是有限的。

  “三步法”的测试完整性是空前的,读者可以比较一下,自己参与过的项目,所要求达到的覆盖率是怎么样的?做得比较好的,一般只是要求达到100%的代码覆盖,执行中还未必能做到,而“三步法”所要达到完整性是这样的:1)100%语句、条件、分支、路径覆盖;2)用自动动态测试捕捉未考虑某些特殊输入形成的错误。经过这种彻底测试后,遗留的错误可以说已经极少了。

  自动静态分析只能发现语法特征错误,现代编译器对多数这类错误会给出警告,另外,现有的自动静态分析技术会产生大量的误报,在一大堆报告中去一条一条人工辨别,寻找遗漏的错误,无异于“大海描针”。人工静态分析也差不多。先做这两项又怎么样?显然也是没必要的。

  为了统一代码风格,可以偶尔抽查代码,也就是说,可以用人工静态方法检查代码风格和编码规范。

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

精彩评论

  • kerusha
    2010-11-30 22:46:17

    大哥,你那这么简单的例子来论证这么庞大的问题,太儿戏了吧?参数的类型难道仅仅是某些值么?

  • msw_cn
    2010-11-24 10:57:16

    人工生产测试用例和自动生产测试用例有啥区别?我觉得自动生产测试用例是幻想。
    生产的测试用例是自动的,还是手动的?我理解是自动的。
    感觉像是毕业论文。三步法仅进行一次迭代,就达到‘空前’的完整性了。既然第二步能统计白盒测试的覆盖率,为什么第三步完成后,不再统计一遍。看看是否达到了预期的覆盖率。

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号