用代码复杂度分析风险

上一篇 / 下一篇  2013-04-22 22:16:24

一些测试技术,比如边界值分析和结对测试,可以有效的帮助我们在尽量少的增加风险的同时,减少测试用例的数目。然而常见的问题在于产品的缺陷并不是 平均分布在代码里面的。在一些典型的软件项目中,总有一些组件比其他组件存在更多的缺陷,软件测试一个非常必要的环节就是预测那个项目区域存在更多的缺 陷,并有针对行的投入测试力量。

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

运用这种度量只要是用来标识可能需要返工或是额外分析的代码

3.2.面向对象的度量

面向对象的度量是各种语言中类和类结构相关的度量(Java、C++、C#),该方法即度量。该方法包含以下内容:

1.每个类的权重方法(WMC)。一个类中方法的数目。

2.继承树的深度(DIT).一个类所继承的类的数目。

3.对象类之间的耦合(CBO)。一个类引用其他类的方法或是实例变量的数目。

在面向对象的编程中,扇入和扇出度量分别用来计算有多少类调用到某一特定的类,有多少类被某一特定的类调用。例如一个类包含的方法被其他5个类调 用,但是这个方法同时调用了其他10个类,那么它的扇入就是5,扇出就是10.那么也就是说,如果修改了扇出中的某个类,同时就要测试扇入5个类的地方 (这样说不是很确切,但意思就是这么回事)。

4.如何利用复杂度度量

同时使用集中方法检查函数的复杂度,通过结合和权衡这些数据来减少误诊

函数名              回路复杂度      调入函数的数量   代码行数
OperAccount           21                3                         42
CloseAccount          9                 24                       35
updatepassword       17               18                      113
从中可以看出,OperAccount函数回路复杂度很高,但调入函数却很少(扇入),代码函数也很少,所有这个函数只需通过减少回路复杂度(分支语句)即可。
CloseAccount函数,回路复杂度很低,调入函数很高,代码行数很少,只需减少调入函数的个数。
updatepassword函数,是相对危险的,测试需要重点测试的,回路复杂度、调入函数、代码行数,都比较高。

代码复杂度是识别应用程序中可能存在缺陷的一种基本度量,对于识别代码维护性的问题也具有同等价值,复杂度是容易误用的度量,所以重要的是如何聪明 的使用这个度量,并且监视度量的变化,以保证该度量所指示的情况正是你所期望的它能发现的。高度的复杂度只能告诉你这段代码可能会有很多缺陷,但仍需要额 外的调查来证实这个结果。


本文出自“shadowwalker”博客http://www.51testing.com/?622454,转载请保留出处


TAG:

xin_晴的个人空间 引用 删除 xin_晴   /   2013-04-23 11:00:16
您好,我是51Testing软件测试网的编辑,您的本篇博文被推荐至51Testing软件测试网首页发表:http://www.51testing.com/html/53/n-844553.html
感谢您关注并支持51Testing博客,期待您更多的优秀原创博文。
 

评分:0

我来说两句

日历

« 2024-04-27  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 12117
  • 日志数: 9
  • 建立时间: 2013-04-21
  • 更新时间: 2013-05-05

RSS订阅

Open Toolbar