用代码复杂度分析风险

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

  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  24  35 
updatepassword  17  18  113 

  从中可以看出,OperAccount函数回路复杂度很高,但调入函数却很少(扇入),代码函数也很少,所有这个函数只需通过减少回路复杂度(分支语句)即可。

  CloseAccount函数,回路复杂度很低,调入函数很高,代码行数很少,只需减少调入函数的个数。

  updatepassword函数,是相对危险的,测试需要重点测试的,回路复杂度、调入函数、代码行数,都比较高。

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

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-08-02 08:57:43

用代码复杂度分析风险的相关文章

浅谈遗留代码的重构

             背景 <重构>诞生至今有近17个年头了,日常开发中大家谈到重构,要么非常随意,认为重构就是改代码:要么非常谨慎,把重构描述成焦油坑,像瘟神一样敬而远之.针对最具挑战性的遗留代码重构,有哪些需要注意的呢? 谈论任何事情,都该有它的上下文.本文谈论的技术背景是大型通信类产品,对于互联网产品不一定适用.另外,本文也不会涉及重构技术,有兴趣读者可以读<重构>或者<Effective Refactoring in C++>. 遗留代码重构决策表 遗留代码

PHP实现Mysql数据库连接、查询、记录集操作代码实例

在PHP网站开发中,经常需要对Mysql数据库进行操作,大体上需要经过以下几个步骤:Mysql数据库链接.Mysql数据库查询.Mysql记录集操作等,如果每次都重复上述操作,不但繁琐,而且代码冗余度高,对此我整理了部分利用PHP实现Mysql数据库操作的代码,以函数的形式贴出,可根据自行需要添加其他功能或者整合成Mysql数据库类. Mysql数据库链接代码 123456789101112 function dbConnect($hostname,$username,$pass,$db_nam

关于圈复杂度CCN NCSS

关于软件度量中的圈复杂度   首先看两个概念:   NCSS(Non Commenting Source Statements)有效代码行,扣除注释. CCN(Cyclomatic Complexity Number),圈复杂度.1个方法的CCN值通常意味着我们需要多少个测试案例来覆盖其不同的路径.当CCN发生很大波动或者CCN很高的代码片段被变更时,意味改动引入缺陷风险高.根据资料,圈复杂度(或CC)大于10的方法存在很大的出错风险. 以下内容摘自:http://blog.csdn.net/y

如何从开发阶段提升代码质量,加速迭代发布?

 引言:一个 bug 被隐藏的时间越长,修复这个bug 的代价就越大.在<快速软件开发>一书中已引用了大量的研究数据指出:最后才修改一个 bug 的代价是在 bug 产生时修改它的代价的10倍.        很多开发工程师很不喜欢测试的工作,他们更希望能够开发新功能,但在日常研发过程中,测试的重要性想必也不言而喻.单测集成系统,可以从开发阶段提高质量,加快代码发布.        云效平台的单测集成功能,是通过对项目仓库地址(git.svn),进行代码变更监控,然后得到静态扫描,单测用例执行

《代码之殇》(原书第2版)——第3章根除低下的效率 2007年2月1日

2007年2月1日:"糟糕的规范书:该指责谁?" 规范书基本上都是可怕的.不仅仅指项目管理规范书,而且也包括开发规范书和测试规范书.我说的"可怕",主要是指难以撰写,难以使用,而且难以维护.你要知道,这很可怕!规范书往往还是不完善的,组织得很差,并且没有得到充分的复审.规范书永远都是这个样子,也看不到有任何变好的迹象. 为此,我想要指责项目经理,部分原因是因为我喜欢这么做,但更主要的还是因为他们是糟糕规范书的始作俑者.然而,事实不允许我指责项目经理.人人都在写糟糕的

《JavaScript专家编程》——9.4 度量JavaScript代码质量

9.4 度量JavaScript代码质量 为了让计算精度上升到最高,客观质量分析以程序化的方式对代码进行分析.这项任务可以使用编程工具完成,这些工具能够在多种情况下评估代码,根据各项指标得到最终的质量得分.本节介绍了静态代码分析,这种方法非常适合评估JavaScript的质量. 静态代码分析 静态代码分析就是不通过运行代码来分析代码的过程.静态分析看起来非常像一个文本编辑器的拼写检查器.拼写检查器扫描文档的正文来寻找错误和含糊之处,而并不需要了解文本的意义.同时,静态代码分析从功能上分析源代码的

6 个重构方法可帮你提升 80% 的代码质量(转)

英文原文:Top 6 Refactoring Patterns to Help You Score 80% in Code Quality 在过去做了不少代码走读,发现了一些代码质量上比较普遍的问题,以下是其中的前五名: 臃肿的类: 类之所以会臃肿,是因为开发者缺乏对最基本的编码原则,即"单一职责原则"(SRP)的理解.这些类往往会变得很臃肿,是由于不同的且在功能上缺少关联的方法都放在了相同的类里面. 长方法: 方法之所以会变得很长主要是有以下几个原因: 许多没有关联性的.功能复杂的模

请求给这段代码注释

问题描述 namespaceAsyncTcpClient{publicpartialclassFormClient:Form{//是否正常退出privateboolisExit=false;//退出:false时,不退出privateTcpClientclient;//私人的tcpclient客户端privateBinaryReaderbr;//私人的读取br;privateBinaryWriterbw;BackgroundWorkerconnectWork=newBackgroundWorke

C#使用读写锁三行代码简单解决多线程并发的问题_C#教程

在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文件并不允许多个线程同时写入,否则会提示"文件正在由另一进程使用,因此该进程无法访问此文件". 这是文件的并发写入问题,就需要用到线程同步.而微软也给线程同步提供了一些相关的类可以达到这样的目的,本文使用到的 System.Thr