实现完整测试的思路和方法
2009-11-11 09:58
169 查看
这里提出用“三步法”尽可能实现完整测试:
第一步:基本[b]功能测试[/b]
程序的功能是人为的规定,工具不可能自动了解,因此,针对基本功能的测试用例需要人工来建立,这是无可躲避的。根据程序的设计要求,基本功能用例通常不难设计,把程序功能细化、明确化,列成“什么输入,应产生什么输出”的形式,就是测试用例。程序员准备编码时和编码过程中,是建立基本功能用例的最佳时机,为什么呢?因为程序员编码之前和编码过程中,一定要弄明白程序的功能,也就是要想清楚“会有哪些输入?某种输入时程序应该做什么?产生什么结果?”,这里,“哪些输入”就是指有哪些等价类,产生的“结果”就是输出,从编码的角度来看,这些就是程序的功能点,从测试的角度来看,这些就是现成的用例。如果有详细设计文档,那么测试人员可以根据文档来设计用例,否则最好由程序员建立基本功能用例。这一步可视为“黑盒方法”。
第二步:用白盒方法找出遗漏用例
正因为程序功能是人为的规定,“黑盒方法”很难衡量完整性,而“白盒方法”恰恰具有易于衡量测试完整性的优点,两者可以很好互补,请看下面的示例代码:
voidFunc(int* p)
{
if(p)
{
*p = 0;
}
else
{
return;
}
}
参数p是一个指针,测试时当然要将空指针作为一个等价类,如果漏了这个等价类,会怎么样呢?分支覆盖会不完整:else分支未覆盖。从这个例子可以看出,未覆盖的逻辑单位通常对应未测试的等价类,因此,白盒覆盖可以衡量等价类是否完整并可帮助找出遗漏的用例。
“白盒方法”用逻辑覆盖率来衡量测试的完整性。逻辑单位主要有:语句、分支、条件、条件值、条件值组合,路径。语句覆盖就是覆盖所有的语句,其他类推。还有一种判定条件覆盖,其实是分支覆盖与条件覆盖的组合。跟条件有关的覆盖就有三种:条件覆盖是指覆盖所有的条件表达式,即所有的条件表达式都至少计算一次,不考虑计算结果;条件值覆盖是指覆盖条件的所有可能取值,即每个条件的取真值和取假值都要至少计算一次;条件值组合覆盖是指覆盖所有条件取值的所有可能组合。与条件直接有关的错误主要是逻辑操作符错误,例如:||写成&&,漏了写!什么的,采用分支覆盖与条件覆盖的组合,基本上可以发现这些错误,另一方面,条件值覆盖与条件值组合覆盖往往需要大量的测试用例,因此,这两种覆盖的效费比偏低。基于以上理由,这里提出采用语句、条件、分支、路径覆盖的组合来衡量测试完整性和找出遗漏用例。
第三步:用自动用例捕捉漏网之鱼
还是上面的例子,假如程序员完全忘了有空指针这回事,把代码写成这样:
voidFunc(int* p)
{
*p = 0;
}
由于判断p是否为空指针的代码不存在,白盒覆盖当然不会提示“某某代码或某某分支未覆盖”,因此,白盒覆盖不能发现“程序员未处理某些特殊输入”形成的错误,即使达到了无与伦比的白盒覆盖率,仍然不能保证找出所有等价类。
程序员会忘记处理哪些输入呢?常见的输入一般是不会记的,否则程序的起码功能都未实现,容易忘记的是一些"偏僻"的输入,例如,空指针、空字符串、很大的数、很小的数、合法取值边界附近的值等等,从输入的角度来看,这些特殊值通常跟数据类型有关,从程序的行为来看,这些特殊输入常常会导致崩溃、产生异常,或超时,即具有行为特征,正好是自动用例可以发现的,因此,可以利用自动用例来捕捉“程序员未处理某些特殊输入”形成的错误。这就是“三步法”中的第三步。
第一步:基本[b]功能测试[/b]
程序的功能是人为的规定,工具不可能自动了解,因此,针对基本功能的测试用例需要人工来建立,这是无可躲避的。根据程序的设计要求,基本功能用例通常不难设计,把程序功能细化、明确化,列成“什么输入,应产生什么输出”的形式,就是测试用例。程序员准备编码时和编码过程中,是建立基本功能用例的最佳时机,为什么呢?因为程序员编码之前和编码过程中,一定要弄明白程序的功能,也就是要想清楚“会有哪些输入?某种输入时程序应该做什么?产生什么结果?”,这里,“哪些输入”就是指有哪些等价类,产生的“结果”就是输出,从编码的角度来看,这些就是程序的功能点,从测试的角度来看,这些就是现成的用例。如果有详细设计文档,那么测试人员可以根据文档来设计用例,否则最好由程序员建立基本功能用例。这一步可视为“黑盒方法”。
第二步:用白盒方法找出遗漏用例
正因为程序功能是人为的规定,“黑盒方法”很难衡量完整性,而“白盒方法”恰恰具有易于衡量测试完整性的优点,两者可以很好互补,请看下面的示例代码:
voidFunc(int* p)
{
if(p)
{
*p = 0;
}
else
{
return;
}
}
参数p是一个指针,测试时当然要将空指针作为一个等价类,如果漏了这个等价类,会怎么样呢?分支覆盖会不完整:else分支未覆盖。从这个例子可以看出,未覆盖的逻辑单位通常对应未测试的等价类,因此,白盒覆盖可以衡量等价类是否完整并可帮助找出遗漏的用例。
“白盒方法”用逻辑覆盖率来衡量测试的完整性。逻辑单位主要有:语句、分支、条件、条件值、条件值组合,路径。语句覆盖就是覆盖所有的语句,其他类推。还有一种判定条件覆盖,其实是分支覆盖与条件覆盖的组合。跟条件有关的覆盖就有三种:条件覆盖是指覆盖所有的条件表达式,即所有的条件表达式都至少计算一次,不考虑计算结果;条件值覆盖是指覆盖条件的所有可能取值,即每个条件的取真值和取假值都要至少计算一次;条件值组合覆盖是指覆盖所有条件取值的所有可能组合。与条件直接有关的错误主要是逻辑操作符错误,例如:||写成&&,漏了写!什么的,采用分支覆盖与条件覆盖的组合,基本上可以发现这些错误,另一方面,条件值覆盖与条件值组合覆盖往往需要大量的测试用例,因此,这两种覆盖的效费比偏低。基于以上理由,这里提出采用语句、条件、分支、路径覆盖的组合来衡量测试完整性和找出遗漏用例。
第三步:用自动用例捕捉漏网之鱼
还是上面的例子,假如程序员完全忘了有空指针这回事,把代码写成这样:
voidFunc(int* p)
{
*p = 0;
}
由于判断p是否为空指针的代码不存在,白盒覆盖当然不会提示“某某代码或某某分支未覆盖”,因此,白盒覆盖不能发现“程序员未处理某些特殊输入”形成的错误,即使达到了无与伦比的白盒覆盖率,仍然不能保证找出所有等价类。
程序员会忘记处理哪些输入呢?常见的输入一般是不会记的,否则程序的起码功能都未实现,容易忘记的是一些"偏僻"的输入,例如,空指针、空字符串、很大的数、很小的数、合法取值边界附近的值等等,从输入的角度来看,这些特殊值通常跟数据类型有关,从程序的行为来看,这些特殊输入常常会导致崩溃、产生异常,或超时,即具有行为特征,正好是自动用例可以发现的,因此,可以利用自动用例来捕捉“程序员未处理某些特殊输入”形成的错误。这就是“三步法”中的第三步。
相关文章推荐
- 快速构建基于代码级性能测试方法的一种思路和简单实现
- JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
- 实现完整单元测试的思路和方法
- 浅谈利用SQLite存储离散瓦片的思路和实现方法
- JavasSript实现秒转换为“天时分秒”控件和TDD测试方法应用
- 简单完整的代码,通过这个代码你将对RSA加密算法在Java中的实现方法有一个初步的了解,这个类,你可以直接使用,水平高的,就自己修改完善下代码。
- 思路分享 | 指纹考勤机实现远程打卡测试
- ionic开发——完整搜索功能的实现方法
- javascript实现俄罗斯方块游戏的思路和方法
- Android编程实现隐藏状态栏及测试Activity是否活动的方法
- javascript实现俄罗斯方块游戏的思路和方法
- 现代JVM内存管理方法及GC的实现和主要思路
- centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB 注意down掉网卡的方法 nginx效率没有LVS高 ipvsadm命令集 测试LVS方法 第三十三节课
- jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
- PHP中的session永不过期的解决思路及实现方法分享
- 跨平台的目录遍历实现方法(windows和linux已经测试)
- ORM开发之解析lambda实现完整查询(附测试例子)
- SpringBoot实现短信验证码校验方法思路详解
- H5 Web App 的性能测试平台 : 使用 Frida 实现 AOP 拦截 hook Android 原生应用的方法
- Android程序自动更新功能模块的实现方法【附完整demo源码下载】