一些测试技术,比如边界值分析和结对测试,可以有效的帮助我们在尽量少的增加风险的同时,减少测试用例的数目。然而常见的问题在于产品的缺陷并不是 平均分布在代码里面的。在一些典型的软件项目中,总有一些组件比其他组件存在更多的缺陷,软件测试一个非常必要的环节就是预测那个项目区域存在更多的缺 陷,并有针对行的投入测试力量。
1、风险行业
基于风险的测试就是基于缓解产品中潜在风险的测试方法。该方法倾向于把可用的测试资源集中在最需要的区域。无法做到“面面俱到”的测试,我们就需要基于一系列的标准,有选择地集中投入测试力量。
基于风险测试的方法是尝试归类出部分产品组建拥有更普及的用户场景,从而投入更多的测试力量。但这种测试方法的风险依赖于对测试重点的精确选择,从而忽略了一个事实,还是有用户会使用那些20%以为的功能和代码的。
对最有可能产生缺陷的产品部分编写更多的测试用例是基于风险测试的另一种应用。
2、复杂问题
我们用一种寻找高复杂度代码的方法来预测缺陷出现的地方,代码审查。
作粗略的代码审查时评感觉和主观衡量代码复杂度有时就足够了。
最简单的代码复杂度测量方式可能是代码行数(LOC),行数越多,复杂度就越高。但是判断行数,没有统一的标准,个人有个人判断的方法,我倾向于只计算语句(C语言为例,只计入以分号结束的行)。你只需挑选你喜欢的即可以。
3、测试回路复杂度
所谓回路也就是程序中选择和判断的语句。回路复杂度度量方法,即辨别函数中线性独立路径(或判断)数目的度量方法。一个没有包含条件判断操作(比如条件语句,循环等)的函数在整个程序中只有一条线性独立的路径。
计算McCabe复杂度=边-节点+2,还有一个最简单的方法:将条件(判断)语句的数量加1.
3.1 Halstead度量
Halstead度量是一套完全不同的复杂度度量,基于程序中语法要素以下4个度量:
● 独特算子的数量(n1)
● 独特算域的数据(n2)
● 所有算子出现的总数(N1)
● 所有算域出现的总数(N2)
代码长度值=N1+N2;难度度量=(n1/2)*(N2/n2);
void HalsteadSample(int value) { if (value != 0) { if (value < 0 ) value + = 1; else { if (value == 99) value = 0; else value - = 1; } } } |
算子 数量 算域 数量
!= 1 value 6
< 1 0 3
+= 1 1 2
== 1 999 1
= 3
-= 1
总计:n1=6,N1=8,n2=4,N2=12
函数长度量=(N1+N2)=18,难度系数(n1/2)*(N2/n2))=9
运用这种度量只要是用来标识可能需要返工或是额外分析的代码