您好,欢迎访问三七文档
单元测试代码评审质量评审质量评审特点优点复杂度分析代码评价度量代码结构化化简LCSAJs质量模型质量评审能力•检查多个代码复杂性度量元–圈复杂度–结点度量–LCSAJ控制流(测试路径)•识别死代码和不可测试代码•提供功能强大的结构化化简工具–结构化程序验证–将你的代码化简到基本复杂度•使用工业标准或自定义质量模型–提供边界检查–产生定量评估•将所有结果总结成顶层的度量指标–清晰性/测试性/维护性•提供直观的报告和代码可视化工具复杂性•通常检查多余的复杂性是非常困难的•程序的复杂性并不可怕,但是多余的复杂性会引起软件出问题度量元•度量元是软件度量的基础,就象“米”是对长度的度量•注意度量结果本身并不能直接就反应出质量好坏•在质量评审中使用度量源元时,相互的关联是最重要的质量评审–代码评价度量清晰性系统的可理解性如何可维护性软件的可维护性如何?可测试性对系统进行测试需要多少工作?复杂度度量–控制流结点–圈复杂度–基本结点和基本圈复杂度–循环嵌套–函数扇入和扇出–不可达性结点分类•跳转分为下列几类:–向上(向后)跳转–向下(向前)跳转•结点根据跳转类型可以分为:–下-下结点–上-下结点–上-上结点153421534215342引起结点的C结构•下列编程结构会引起结点:forwhileswitch•可利用基本结点度量消除这些局限性引起结点的Ada结构•下列编程结构会引起结点:IFTHENELSECASEGOTOExceptions•可利用基本结点度量消除这些局限性圈复杂度•从有向图G,计算圈复杂度V(G):V(G)=No.edges(边数)-No.nodes(节点数)+2•这样也正确:V(G)=No.predicates(判定节点数)+1•Case结构(有N种选择)是个例外,计算为N–1V(G)=No.regions(区域数)•假如G是个连接的平面图圈复杂度例子12条边9个节点VG=12-9+2=5145236789123456789101112圈复杂度例子3个判定结点计算为4case计算为2VG=4+1=53-111圈复杂度例子5个区域VG=532451结点和圈复杂度13245此有向图可表示为右边两种程序结构。1452315342V(G)=6-5+2=3V(G)=6-5+2=3Knots=4Knots=1结点和圈复杂度•圈复杂度和结点度量是互补的两个指标•总之,程序结构化度量量化了软件的属性–圈复杂度用于表明程序复杂性–结点度量用于表明程序实施时附加的复杂性循环的复杂性度量•由流程图研究源代码的循环结构•用于度量复杂性和代码优化•识别循环结构•不被源代码结构所影响•函数度量:–函数入口和出口(扇入扇出)–循环总数–循环最大深度C++OO实现•类的数目•子类的数目•每个类的方法•继承深度•数据成员的数据•类外的函数调用•其他Chidamber和Kemerer度量程序结构化验证程序结构化验证•通过匹配程序结构模版执行结构化验证,模版使用源代码基本块的流程图表示•使用检查工具自动运行•检查下列结构:if-then-endifif-then-else-endifdo-whilewhileforcase•可配置成识别其他结构程序结构化确认•由于使用非正确的结构形式,C语言非常容易产生错误:–需要switch,case,default和break语句的case语句–if-then语句也容易产生错误–for循环结构也容易产生错误SPV建议•如果检测到非结构化的代码,这部分代码应该由程序员重新编写,这不包括为了解决某些特殊问题而有意使用的非结构化编程•除了允许以修改非结构化程序会带来不必要的复杂为理由以外,建议管理者可以先怀疑任何非结构化编程的使用•流程图看起来很混乱,并不总是意味着代码是非结构化的。绘制流程图的算法可能会误导程序是高度复杂的•通常程序的非结构化是由于代码内部错误引起的SPV流程图•SPV流程图,图形化地显示设计良好的程序结构中节点的化简过程代码评审流程图基本结点度量•将所有的结构化的程序结构进行化简后,计算剩余的节点数就得到基本结点度量•对于一个结构化的程序:基本结点数=0•基本结点是非结构化程序引起的复杂性的度量基本圈复杂度•某些结构化的编程结构会引起很高的圈复杂度•这个局限性可用基本度量克服•定义:EV(G)=V(G)-M这里M是有唯一入口和出口节点的子图G的数目•对于一个结构化的程序:EV(G)=1SPV度量总结•如果一个模块通过SPV化简之后是结构化的,它有:–基本结点为0–基本圈复杂度为1•非结构化的程序含有很高的基本度量值•这两个度量是对代码中存在的结构缺陷的度量复杂度分析标准•复杂度分析标准违反情况•位于代码评审报告中•用于强制源代码执行特定的质量特性1CCyclomaticComplexitygreaterthan***2CProcedureisnotreducibleintermsofintervals3CProcedurecontainsessentialknots4CProcedureisnotstructured5CProcedurecontainsinfiniteloopLCSAJs线性代码序列及跳转LCSAJs•维护性度量指标•检测不可达代码•识别不可测试(或不合理)代码•强制用于欧洲安全苛刻性军用航空电子项目•路径测试的覆盖度量基础•最高级别的代码覆盖率度量LCSAJ三要素•根据定义和LDRA的代码重格式化策略,LCSAJs能描述成三要素的形式:–1.起始点[一个线性代码序列]–2.结束点–3.目标点LCSAJ起始点•LCSAJs开始于:–程序的第一行可执行代码–A的第一行可执行代码,A可以是:•功能•程序•方法…–任何控制流跳转的目标行:•标号•else语句•endif语句•switch语句的子句•循环•函数调用的返回...LCSAJ跨度LCSAJ跨度是程序中的最小分割,任何LCSAJ的线型代码序列都完全包含在LCSAJ的跨度中LCSAJ跨度的第一行可以是程序的开始,或者是前面的LCSAJ序列不能到达的那一行LCSAJ跨度的终止行可以是程序的结束行,或者是控制流不能经过其下一行的代码行SpanFINISH82else1------------------------------------------------------------------------START83{184mess=HelloThere;185}1START86}2START87}3START88printf(%d%d%d%20s\n,i,j,k,mess);4FINISH89}4------------------------------------------------------------------------STARTFINISH90}1LCSAJ密度•LCSAJ密度是维护性度量元•如果某一行代码作了修改,LCSAJ密度会告诉用户由于此代码修改影响到多少条LCSAJ•如果密度越高,那么就越会降低对于所有的LCSAJ此改变都是正确的信心,因此必须增加需要的回归测试数目Code“LCSAJ”LinesDensitya=b2if2(a==x)2{1b=y;1}1print(“ok”);2不可达的LCSAJs•如果从程序开始没有任何路径到达指定的代码行,那么代码将被标为不可达(或死代码)•这种现象通常出现在紧跟着goto语句的代码行中,典型例子如右面最后一行代码•不可达的LCSAJs标记显示在下面的例子中ifI=0thengotolabel:endif;FINISH235gotol6;2---------------------------------------------------------------------236z=5;0UNREACHABLE*****237z=9;0UNREACHABLE*****START238l6:1239z=10;1FINISH240}1不可测试的LCSAJs•LCSAJ是一路径片段,通常在它的线性代码序列中包含许多条件•如果LCSAJ的执行依赖于程序中的某些条件,而且永远不会满足这些条件,那么LCSAJ可能是不可测试的(因此是不可执行的)LCSAJ报告•总结部分•详细的代码清单:–LCSAJs出现的地方–源代码内的位置–LCSAJ三要素列表–不可达的LCSAJs列表•通过追踪局部的控制流分支,任何不可达的代码都会在报告中着重显示LCSAJ(路径测试)流程图质量评审报告度量的解释•像大多数其他的物理度量一样,度量的大小并不能表明事物的好或者坏•通常认为最好要保证函数符合这样的度量,这增加了程序的可读性和可维护性质量评审报告•显示复杂度度量和源代码的信息•显示函数级别的复杂度度量和整体源代码的复杂度度量•许多结果也能够以图形化的方式显示•可用的度量包括:–圈复杂度度量–源代码基本块–结点度量–函数的入口出口–循环数目和嵌套深度–程序结构化验证质量评审报告质量评审-质量模型质量评审报告ReformattedCodeInformationforFileTotalreformattedLines,Totalcommentsinref.Code,Executableref.Lines,Non-executableref.LinesNumberofProcedures,TotalsourceLines,ExpansionFactor.CommentsAssociatedwithProcedures(%oftotal)TotalComments,CommentsinHeaders,CommentsinDeclarations,CommentsinExecutableCodeBlankLines.RatioofCommentstoExecutablelines(%)TotalComments/Exe.Lines,HeaderComments/Exe.Lines,DeclarationComments/Exe.Lines,CodeComments/Exe.LinesHalstead'sMetricsTotalOperators,TotalOperands,UniqueOperators,UniqueOperandsVocabulary,Length,Volume.LCSAJandUnreachabilityTotalLCSAJs,ReachableLCSAJs,UnreachableLCSAJs,MaximumLCSAJDensityUnreachableLines,UnreachableBranches.FileBasedC++OOMetricsTotalStructuredTypesDeclared,TotalObjectsCreated.ClassLevelC++OOMetricsObjectsCreated,NumberofDataMembers,NumberofMembers,NumberofChildClassesClassLevelOOMetrics-withBaseClassesTotalBaseClasses,TotalDataMembers,TotalMembers,InheritanceDepthClassLevelOOMetrics-withBaseClasses(2)质量评审报告•包含质量评审产生的信息:–复杂度标准违反情况–详细报告中有每个函数的复杂度汇总表柱状图•柱状图用于图形化显示“质量度量”的数目,包括:–测试中的文件(单元/模块)–Tbset系统范围的结果Kiviat图•图形化表示质量模型–假如源代码满足质量标准,就显示为绿色–假如源代码不满足质量标准,就显示为红色•直观可视地表示与标准的一致性•图示给出度量元达到的实际值Kiviat图的解释•每个度量元都显示在轴上•度量元达到的值都绘制在轴上•绿色的区域表明度量元的值在上边界和下边界之间•超过边界的区域显示为红色可用的不同Kiviat图•Kiviat图可用于:–维护性–测试性–清晰性•以整个
本文标题:03质量评审
链接地址:https://www.777doc.com/doc-423432 .html