您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 嵌入式软件测试技术[QUALITY]
1嵌入式软件测试技术嵌入式软件测试技术(静态篇:软件质量分析)(静态篇:软件质量分析)皮永辉2012.9ualitySoftware2嵌入式软件静态测试技术软件度量与质量分析内容提要•没有测量,何来控制–软件度量概述•软件度量,各有所长–常用软件度量方法–从分析结构入手--McCabe复杂度概述•代码结构的复杂程度–圈复杂度•代码结构的良好程度–基本复杂度•软件质量分析–McCabe复杂度与质量的关系–结构化测试3软件度量与质量分析没有测量,何来控制只有当你对你所谈到的东西进行测量,并用数量表示出来时,你就对它有了一定了解,反之,你对它并没有真正的了解.LordKelvin,1889´Youcan‘tcontrolwhatyoucan‘tmeasure.´DeMarco,19824什么是度量什么是度量((MetricMetric)?)?•度量(Metric)–测量、计算,用定量的方法描述一个实体的某一属性–软件的度量•和项目相关•估算性测量•复杂性度量软件度量与质量分析没有测量,何来控制5•软件代码度量–软件是特殊产品,难以度量–通过度量了解质量特性•软件质量属性–正确性–健壮性–可靠性–性能–易用性•度量的好处–从定性到定量–质量分析、控制–为进一步的分析、评估、决策等提供依据–安全性–可扩展性–兼容性–可移植性–…软件度量与质量分析没有测量,何来控制65.1o-1sn?•度量要面对的问题–Whatdowewanttomeasure?我们要测量什么?–Howdowemeasure?我们应如何测量?–Whatdothemeasurementsmea测量的意义何在?软件度量与质量分析没有测量,何来控制7可测量的不可测量的•测什么?–功能、性能–质量属性–复杂程度–结构–物理尺寸–模块、路径–…•如何测?–并非所有的属性都是可直接测量的–简单、易实现、直观、数字化•意义?–并非可测量的都有意义–好的度量如何评价软件度量与质量分析没有测量,何来控制8•何谓好的度量–好的度量必须:•直观•客观•语言独立–好的度量应该:•和错误的出现有直接关联•能反映测试的工作量•自动化•简单•不少软件度量方法都是针对复杂性的软件度量与质量分析没有测量,何来控制9•常用软件度量–LineCountMetrics行数统计度量–HalsteadMetricsHalstead度量–FunctionPoint功能点–McCabeMetricsMcCabe度量–…•软件产品的复杂性–文本复杂性–逻辑结构复杂性–功能体系复杂性–…软件度量与质量分析软件度量,各有所长10•起源–测量物体的尺寸是研究它的开始–最简单、直接的一种方法•技术–对模块代码行进行分类统计,提供代码行、注释行、空白行、混合行–提供代码的总额,但不关注内容和结构–LOC复杂度:•blanks(空白行):空行(只有空格、Tab),没有其他字符•code(代码行):纯代码行,不含注释•comments(注释行):纯注释行,不含代码•mixed(混合行):既有代码,又有注释软件度量,各有所长行数度量(LOC)11•优势–软件物理规模的直接度量–易于理解–计算简单–语言独立–定义了不同类别的代码行(如注释行和空行),有利于进一步分析、引用–协助指出难以理解的模块•注释行通常增加了可读性,但不寻常的大量注释意味着模块难以理解软件度量,各有所长行数度量(LOC)12•起源–1977年,由MauriceHalstead提出–计算模块的操作数和操作符(运算符),直接得出模块的复杂程度的一种定量测试方法–通过分析源代码对模块进行度量,重点是复杂性的计算–应用于代码,经常作为一种维护性度量。也可作为对难度、工作量的一种评估–自诞生之日起,就充满争议软件度量,各有所长Halstead度量13•技术–Halstead度量主要基于4种源自程序代码的统计数值:•n1=独立的操作符的数量(操作符的种类数)•n2=独立的操作数的数量(操作数的种类数)•N1=操作符总数•N2=操作数总数–通过以上数据,可以计算5种复杂度:复杂度符号公式•程序长度(Programlength)NN=N1+N2•词汇量(Programvocabulary)nn=n1+n2•容量(Volume)VV=N*(Log2n)•难度(Difficulty)DD=(n1/2)*(N2/n2)•工作量(Effort)EE=D*V–错误数预测:•Error=V/3000=N*(Log2n)/3000软件度量,各有所长Halstead度量14•优势–不必深入分析程序的结构–计算简单–适用于任何编程语言–预测错误/缺陷的数目–预测测试的工作量–预测维护的工作量–有利于项目规划–对整个开发过程有帮助–经过很多机构的使用和研究,表明Halstead复杂度对预测开发工作量和平均缺陷数非常有用软件度量,各有所长Halstead度量15•起源–1979由Allan.Albrecht开发–从系统的需求和设计出发,对软件的功能进行分类、统计、分析–度量软件的规模和生产力–和软件完成的功能紧密相关–较广泛的认可–国际功能点组织、标准化活动–ISO/IEC标准软件度量,各有所长功能点16•技术–功能点•就是最终用户的业务功能,比如对输入的查询–用户业务功能需求:•数据功能–内部逻辑数据–外部接口数据•事务功能–外部输入–外部输出–外部查询–再配以不同的复杂性,确定14个特征值–计算调整系数,计算功能点软件度量,各有所长功能点17•优势–对以下情况,功能点度量通常被公认为是一种有效方法:•评估软件工程的大小(以及周期)•建立每小时功能点的生产力•评估对需求的支持•评估系统变更的开销•软件模块比较的标准化–唯一与软件功能相关的度量方法–语言独立–较大的用户群:•InternationalFunctionPointUsers’Group(IFPUG,国际功能点用户组织)•多于1,200会员公司–IFPUG提供功能点实践手册,指导标准化的实践活动软件度量,各有所长功能点18•起源–1976年,由ThomasMcCabe提出•1976年发表《软件复杂度》的论文•1982年发表论文《结构测试:使用圈复杂度的软件测试方法》•McCabe测试技术被美国国家标准技术学会(NIST)采用–从分析结构入手,计算模块/程序的复杂程度–提供了比较两个程序复杂度的一种简单、客观的指标–广泛的认可–McCabe复杂度又称:•程序复杂度•循环复杂度(CyclomaticComplexity)•圈复杂度软件度量,各有所长McCabe度量19•技术–McCabe复杂度是基于对软件结构进行严格的算术分析得来,其本质上是对程序拓扑结构复杂性的度量–对模块结构的复杂程度进行量化,并以该复杂度为基础分析基本复杂度等其他复杂度–McCabe复杂度分为模块、类、程序3个层面–McCabe复杂度种类:•圈复杂度•基本复杂度•模块设计复杂度•设计复杂度•集成复杂度•数据复杂度•…软件度量,各有所长McCabe度量20•优势–基于软件结构的严格的数学分析–反映代码的质量–严谨、客观–易于理解–和程序语言无关–广泛的认可–与其他度量互补–可扩展或派生出更多的复杂度–应用优势软件度量,各有所长McCabe度量21•优势–McCabe复杂度的应用•代码质量分析•作为动态测试的指导•代码开发/维护的风险分析•作为项目开发和管理指南•再工程软件度量,各有所长McCabe度量22•预备知识–结构流图•一种描述软件模块逻辑的结构图,类似于流程图•通过源代码建立•是模块判逻辑结构的可视化–流图符号•(箭头)称为“边”(edge),代表控制流•(圆圈或圆点)称为“节点”(node),代表一个或多个语句动作•由节点和边围成的范围称为“域”(region),在计算域时,图形外的区域也应算做一个“域”•判定节点,指包含条件的节点。其判定数等于派生出的分支数软件度量,各有所长McCabe度量23•C常用控制结构流图If..thenIf..then..elseIf..and..thenIf..or..thenDo..WhileWhile../For…Switch软件度量,各有所长McCabe度量244x=x*x;5}1if(y4)2x=sin(y);else3x=cos(y);function_test(y)0{x=3;•结构流图举例1function_test(y)0{x=3;1if(y4)2x=sin(y);else3x=cos(y);4x=x*x;5}013452软件度量,各有所长McCabe度量25•结构流图举例21IFcondition2statement3ENDIF4statement5WHILEcondition6DOSWITCH7Label18statement9Label210statement11Default12statement13ENDSWITCH14ENDWHILE软件度量,各有所长McCabe度量26•圈复杂度(Cyclomaticcomplexity)–是模块结构复杂程度的一种度量–定义为贯穿模块的独立线行路径数–也是保证测试充分所需的最小测试路径数–缩写为v(G)–圈复杂度高,表明模块复杂程度高,不易理解–经验研究表明,圈复杂度与模块错误之间存在较强的关联性•计算方法–公式–断言(判定)–区域(数圈法)代码结构的复杂程度圈复杂度27•公式法–计算流图中所有的边数(e)和节点数(n)–则:v(G)=e–n+2–举例:•e=15•n=12•v(G)=e–n+2=15–12+2=5123456147815910111213(1)(3)(7)(8)(4)(10)(9)(2)(5)(6)(12)(11)代码结构的复杂程度圈复杂度28•断言法–计算流图中所有的判定数(断言数)p–则:v(G)=p+1–举例:•p=4•v(G)=p+1=4+1=5代码结构的复杂程度圈复杂度29•区域法14325–计算所有的由边和节点所围成的区域数(圈的个数)R•注意圈与圈之间要线性独立•最外围也算一个圈–则:v(G)=R–举例:•R=5•v(G)=R=5代码结构的复杂程度圈复杂度30•练习–图中e=22n=18–所以v(G)=e-n+2=22-18+2=6–流图线条有交叉,不宜用数圈法代码结构的复杂程度圈复杂度31•优势–量化了模块逻辑的复杂程度–反映了模块出错的可能性–指出极复杂的、需要进一步分解的模块–指导测试:•圈复杂度=基本路径数=最小测试数•帮助制定测试计划,确定测试重点–帮助管理测试和维护的资源–独立于编程语言–客观、易理解代码结构的复杂程度圈复杂度32•基本复杂度(EssentialComplexity)–模块“非结构化”程度的定量描述,即模块逻辑结构的“良好”程度–基本复杂度是模块按结构化方法简化后的圈复杂度–缩写为ev(G)–基本复杂度高,表明模块的结构“不够良好”•代码质量下降•维护工作加重•模块分割困难•在维护时修改一个错误经常引入其他错误•计算方法–将模块结构流图按结构化方法进行简化(去除结构良好的部分)–再计算简化后的圈复杂度就得到基本复杂度ev(G)代码结构的良好程度基本复杂度33•结构化简化圈复杂度=4v(G)=4McCabe基本复杂度ev(G)=去掉结构化部分重新计算复杂度基本复杂度=1ev(G)=1代码结构的良好程度基本复杂度34•非结构化逻辑举例BranchingoutofaloopBranchingintoaloopBranchingintoadecisionBranchingoutofadecision代码结构的良好程度基本复杂度35•练习v(G)=5简化后流图v(G)=3因此ev(G)=3代码结构的良好程度基本复杂度36•基本复杂度可以帮助我们发现非结构化代码好的设计可以迅速恶化v(G)=10ev(G)=1v(G)=11ev(G)=10代码结构的良好程度基本复杂度37•举例:不良的结构v(Gv(G)=18)=18ev(Gev(G)=17)=17代码结构的良好程度基本复杂度38•举例:良好的结构v(Gv
本文标题:嵌入式软件测试技术[QUALITY]
链接地址:https://www.777doc.com/doc-4331261 .html