Testbed静态测试使用指南V11.docx
《Testbed静态测试使用指南V11.docx》由会员分享,可在线阅读,更多相关《Testbed静态测试使用指南V11.docx(22页珍藏版)》请在冰豆网上搜索。
Testbed静态测试使用指南V11
1Testbed功能介绍
1.1编程规则验证
编程标准验证是高可靠性软件开发不可缺少的软件质量保证方法,使用LDRATestbed自动地验证应用软件是否遵循了所选择的编程规则。
编程规则由软件项目管理者根据自身项目的特点并参考现有的成熟的软件编程标准制定,如DERA(欧洲防务标准),MISRA(汽车软件标准),LDRATestbed依据此规则搜索应用程序,并判断代码是否违反所制定的编程规则。
LDRATestbed报告所有违反编程规则的代码并以文本方式或图形反标注的方式显示。
测试人员或编程人员可根据显示的信息对违反编程规则的代码进行修改。
1.2数据流分析
LDRATestbed分析软件中全局变量、局域变量及过程参数的使用状况,并以图形显示、HTML或ASCII文本报告方式表示,清晰地识别出变量使用引起的软件错误,此种方法既可使用于单元级,亦可使用于集成级、系统级。
通过Testbed数据流分析功能,可方便地分析出软件中一些可能的程序欠缺,如:
1.没使用的函数参数;
2.不匹配的参数;
3.变量未赋初值就引用;
4.代码中有多余变量;
5.给值传递参数赋值;
6.无返回值的函数路径;
7.函数的实参是全局变量。
1.3控制流分析
控制流分析检查以下内容:
1.不可达代码;
2.不合理的循环结构;
3.存在浮点相等比较;
4.函数存在多个出口;
5.函数存在多个入口。
1.4表达式分析
表达式分析检查以下内容:
1.表达式中的括号使用不当;
2.数组下标越界;
3.存在被零除;
4.SWITCH语句缺少DEFAULT;
5.CASE语句缺少BREAK;
6.存在混合运算;
7.对指针进行逻辑比较;
8.在逻辑表达式中使用赋值操作符。
1.5接口分析
接口分析检查以下内容:
1.实参和形参个数不匹配;
2.实参和形参类型不匹配;
3.函数参数定义的结构和调用的结构不一致。
1.6软件质量度量分析
对于软件开发工程师、项目负责人及高级管理者来说,软件质量的管理与监控是非常困难的且费时。
LDRATestbed很好地解决了这一问题,使得管理者很容易地收集正在开发的软件系统的相关信息并判断软件是否满足软件质量标准要求,从而达到对软件项目的质量跟踪与控制。
Testbed提供数据文件接口,用户可基于现行软件标准自行定义适合本系统或项目的软件质量模型。
静态分析的软件度量元和相应的说明见表1:
表1软件质量度量元说明
序号
度量元
指标要求
说明
1
函数代码行数
<=200
函数包含的语句数。
2
注释度量
>=20%
代码的有效注释率。
3
函数参数
<=7
函数参数个数。
4
Goto语句
0
Goto语句数。
5
圈复杂度
<=10
控制流图中边的数量与节点数量之间的差值加2。
6
基本复杂度
<=4
圈复杂度与流程图中结构化子图的数量之间的差值;基本复杂度高意味着非结构化程度高,难以模块化和维护。
7
LCSAJ密度
<=20
LCSAJ密度是一个描述软件可维护性的概念,它是指当改变一行代码时,对其它线性代码顺序和跳转的影响程度,值越大说明影响的测试路径相对越多,因此系统可维护性越低。
8
控制流结点数
<=10
控制流结点数表示流程图中控制流相交的交点数。
9
基本结点数
<=5
将流程图中的结构化部分简化成一个点,简化以后流程图的结点数是基本结点数。
10
扇入度量
<=7
调用本函数的上层函数的个数。
11
扇出度量
<=7
本函数调用下层函数的个数。
2使用Testbed进行编码规则的定制和检查
LDRATestbed可通过编辑编码规则文件cpen.dat/cppen.dat实现编码规则的定制,下面将具体介绍:
2.1确定测试需求
在测试需求分析阶段确定:
1.确定测试对象:
整个MSVC工程还是文件集合;纯C文件、纯C++还是C/C++混合文件。
2.确定测试内容:
确定静态分析规则,可参考附录A所示静态分析推荐规则使用说明。
3.确定测试“类型”:
确定是进行击System分析还是Group分析(选择Group时,不对代码进行集成测试,只是采用批处理方式分析单个文件)。
2.2建立测试工程
1.启动Testbed,根据分析对象,选择测试工程类型。
如需对整个MSVC工程进行分析,选择CreateSetBasedUponMSVCv6Project;如分析对象是一个或多个C、C++文件,选择Select/Create/DeleteSet…。
下面以在Set菜单下选择Select/Create/DeleteSet…选项为例进行说明。
2.在Select/CreateSet输入框中输入“Demo”,点击【Create】按钮
3.点击【System】按钮(选择Group时,不对代码进行集成测试,只是采用批处理方式分析单个文件)。
4.点击右上侧【Add】按钮,选择好要分析的文件,点击【Add】按钮后点【OK】按钮进行确认。
2.3定制代码分析规则
1.点击菜单栏中的Configure,在下拉菜单中点击StaticOptions选项,将会出现如下窗口,点击cpen.dat/cpppen.dat后的Edit按钮,按照提示编辑cpen.dat/cpppen.dat后。
若存在已编辑好的编码规则文件,可按旁边的浏览键直接指定该dat文件,则下面第3步可以省略。
2.编辑第2列,根据实际需求,将对应编码规则置“0”或“1”,置“0”代表该条编码规则无效,置“1”代表该条编码规则有效。
2.4配置Report选项
1.QualityReport配置
点击菜单栏中的Configure,在下拉菜单中点击QualityReportOptions选项,将会出现如下窗口,在ProgrammingStandardModel下拉框中选择“NoModel–allstandards”。
如分析的文件为C、C++混合类型,则在下图右侧所示下拉列表中分别选择一个.C和.CPP文件,选中对应文件后选择在ProgrammingStandardModel下拉框中选择“NoModel–allstandards”。
在OptionalConfiguration中ViolationSummaries选中“All”,根据需要选择ReportViolationsOnly(QualityReport只列出有违反的)。
2.MetricsReport配置
点击菜单栏中的Configure,在下拉菜单中点击MetricsReportOptions选项,将会出现如下窗口,根据测试需求配置metpen,dat及Kiviat.dat文件。
2.5分析执行及结果查看
1.点击菜单栏中的Analysis,在下拉菜单中点击SelectAnalysis,将会出现如下窗口,选择前3项,点击StartAnalysis按钮,开始进行静态分析。
2.静态分析结束后,点击菜单栏中的Individual/SystemResults,选择下拉菜单TextResults中的QualityReport(HTML),查看质量报告。
3结果分析及测试报告编写
3.1质量度量信息的获取
度量度量信息可通过以下几种方式获取:
1.查看规则审查报告:
点击菜单栏中的IndividualResults/SystemResults,选择下拉菜单TextResults中的QualityReport(HTML)。
度量元
指标
查看位置
具体说明
注释度量
>=20%
在QualityReport(HTML)中的GlobalBasicInformation获取可执行代码行总数与注释行总数
注释行总数/(注释行总数+可执行代码行总数)
函数代码行数
<=200
SystemResults菜单下选择TextResults子菜单中的QualityReport(HTML)
函数代码行超过200行
函数参数
<=7
函数参数超过7个
Goto语句
0
使用goto语句
圈复杂度
<=10
圈复杂度超过10
LCSAJ密度
<=20
LCSAJ密度超过20
2.查看质量度量报告:
点击菜单栏中的IndividualResults/SystemResults,选择下拉菜单TextResults中的MetricsReport(HTML)。
度量元
指标
查看位置
具体说明
圈复杂度
<=10
MetricReport中
ComplexityMetrics
CyclomaticComplexity,
基本复杂度
<=4
EssentialCyclomaticComplexity
控制流结点数
<=10
Knots
基本结点数
<=5
EssentialKnots
LCSAJ密度
<=20
LCSAJandUnreachability
MaximumLCSAJDensity
扇入度量
<=7
DataflowInformation
FanIn
扇出度量
<=7
FanOut
3.查看图形化报告:
点击菜单栏中的SystemResults,选择下拉菜单GraphicalResults中的StaticBarCharts。
度量元
指标
查看位置
具体说明
圈复杂度
<=10
SystemResults菜单下GraphicalResults子菜单中的StaticBarCharts
CyclomaticComplexity
基本复杂度
<=4
EssentialCyclomaticComplexity
控制流结点数
<=10
Knots
基本结点数
<=5
EssentialKnots
以圈复杂度为例:
选择StaticBarCharts子菜单下的“EssentialCyclomaticComplexity”,弹出如下所示柱状图,在该界面,将Graph菜单下的ShowBarComponents选中,可查看函数基本圈复杂度具体信息。
3.2程序质量度量报告单
表2程序质量度量报告单
度量元
指标
说明
违反
个数
所在软件
具体描述
函数代码行数
<=200
函数包含的语句数
注释度量
>=20%
代码的有效注释率
函数参数
<=7
函数参数个数
Goto语句
0
Goto语句数
圈复杂度
<=10
控制流图中边的数量与节点数量之间的差值加2
基本复杂度
<=4
圈复杂度与流程图中结构化子图的数量之间的差值
LCSAJ密度
<=20
LCSAJ密度是一个描述软件可维护性的概念
控制流结点数
<=10
控制流结点数表示流程图中控制流相交的交点数
基本结点数
<=5
将流程图中的结构化部分简化成一个点,简化以后流程图的结点数是基本结点数。
扇入度量
<=7
调用本函数的上层函数的个数
扇出度量
<=7
本函数调用下层函数的个数
3.3静态分析质量报告单
报告单中列出的审查内容根据测试需求确定,其中部分度量指标在质量度量报告中会重复出现,此表可以不列出。
审查结果根据根据QualityReport确定。
表3静态分析质量报告单
审查项目
测试内容
审查结果
控制流分析
是否存在不可达代码
是[]否[]
是否存在循环条件不可达
是[]否[]
函数是否包含无限循环(无终止条件)
是[]否[]
是否存在无限循环结构
是[]否[]
在循环语句中是否有多个控制变量
是[]否[]
是否存在浮点相等比较
是[]否[]
使用goto语句
是[]否[]
函数是否存在多个入口
是[]否[]
函数是否存在多个出口
是[]否[]
数据流分析
是否存在标识名重用
是[]否[]
是否存在没使用的函数参数
是[]否[]
函数不是所有的路径上都有返回值
是[]否[]
函数的实参是全局变量
是[]否[]
代码中有多余变量
是[]否[]
变量未赋初值就引用
是[]否[]
参数与期望的作用不匹配
是[]否[]
给值传递参数赋值
是[]否[]
标识符超过31个字符
是[]否[]
函数定义无相应原型
是[]否[]
存在潜在的无限循环
是[]否[]
指针在使用之前没有进行非空检查
是[]否[]
往没有打开过的文件中写
是[]否[]
文件指针在退出时没有关闭
是[]否[]
表达式分析
表达式中使用{}
是[]否[]
存在数组下标越界
是[]否[]
存在被零除
是[]否[]
SWITCH语句是否为空
是[]否[]
SWITCH语句只含DEFAULT情况
是[]否[]
SWITCH语句缺少DEFAULT
是[]否[]
CASE语句缺少BREAK
是[]否[]
返回类型为VOID的函数出现在表达式中
是[]否[]
函数中是否存在Return语句为空
是[]否[]
存在混合运算
是[]否[]
对指针进行逻辑比较
是[]否[]
在逻辑表达式中使用赋值操作符
是[]否[]
表达式中使用空函数
是[]否[]
接口分析
实参和形参个数不匹配(C++无)
是[]否[]
实参和形参类型不匹配
是[]否[]
函数参数定义的结构和调用的结构不一致
是[]否[]
其它
循环体缺少括弧
是[]否[]
函数参数列表为空
是[]否[]
函数参数列表申明不一致
是[]否[]
基本模块中使用#define定义
是[]否[]
SWITCH结构含多个(大于1)DEFAULT
是[]否[]
函数返回类型不一致
是[]否[]
函数和函数的原型的返回不一致
是[]否[]
函数和函数的原型的形参不一致
是[]否[]
函数参数超过7个
是[]否[]
圈复杂度超过10
是[]否[]
LCSAJ密度超过20
是[]否[]
函数代码行超过200行
是[]否[]
附录A:
静态分析推荐规则使用说明
审查项目
Line
级别
测试内容
对应英文规则
控制流分析
362
M
存在不可达代码
#UnreachableCodefound.
184
#Constructleadstoinfeasiblecode.
185
C
存在循环条件不可达
#Infeasibleloopconditionfound.
40
M
函数包含无限循环(无终止条件)
#Procedurecontainsinfiniteloop.
27
M
存在无限循环结构
#Infiniteloopused.
204
M
在循环语句中有多个控制变量
#Morethanonecontrolvariableforloop.
78
M
存在浮点相等比较
#Equalitycomparisonoffloatingpoint.
13
M
使用goto语句
#gotodetected.
58
C
函数存在多个入口
#Procedurehasmorethanoneentrypoint
59
C
函数存在多个出口
#Procedurehasmorethanoneexitpoint
数据流分析
2
M
标识名重用
#Labelnamereused.
41
M
存在没使用的函数参数
#Unusedprocedureparameter.
42
M
函数不是所有的路径上都有返回值
#Functiondoesnotreturnavalueonallpaths.
43
M
函数的实参是全局变量
#Actualparameterisalsoglobaltoprocedure.
44
M
代码中有多余变量
#Variablesweredeclaredbutneverused.
45
M
变量未赋初值就引用
#URdataflowanomaliesfound.
51
M
参数与期望的作用不匹配
#Parametersdonotmatchexpectedactions.
54
M
给值传递参数赋值
#Attempttochangeparameterpassedbyvalue.
12
M
标识符超过31个字符
#Identifierexceeds***significantcharacters.
127
M
函数定义无相应原型
#Proceduredefinitionhasnoassociatedprototype.
137
M
存在潜在的无限循环
#Potentiallyinfiniteloopfound.
361
M
指针在使用之前没有进行非空检查
#Pointernotcheckedfornullbeforeuse
380
M
往没有打开过的文件中写
#Attempttowritetounopenedfile
381
M
文件指针在退出时没有关闭
#notclosedonexit
表达式分析
192
M
表达式中的括号使用正确:
表达式中使用{}
#Curlybracketsusedinexpression.
71
M
存在数组下标越界
#Arrayboundexceeded.
264
M
存在被零除
#Divideby0found.
82
M
SWITCH语句是否为空
#Emptyswitchstatement.
83
M
SWITCH语句只含DEFAULT情况
#Switchcontainsdefaultonly.
72
M
SWITCH语句缺少DEFAULT
#Nodefaultcaseinswitchstatement.
84
M
CASE语句缺少BREAK
#SwitchCasenotterminatedwithbreak.AV193
86
M
返回类型为VOID的函数出现在表达式中
#Voidprocedureusedinexpression.
88
M
函数中是否存在Return语句为空
#Functionwithemptyreturnexpression.
153
M
存在混合运算
#Useofmixedmodearithmetic.
149
M
对指针进行逻辑比较
#Logicalcomparisonofpointers.
176
M
在逻辑表达式中使用赋值操作符
#Assignmentoperatorinbooleanexpression.
88
M
表达式中使用空函数
#Voidprocedureusedinexpression.
接口分析
22
M
实参和形参个数不匹配(C++无)
#Numberofparametersdoesnotmatch.
112
M
实参和形参类型不匹配
#Actualandformalparametersinconsistent.
151
M
函数参数定义的结构和调用的结构不一致
#Parameterstructuremismatch.
其它
12
C
循环体缺少括弧
#Nobracketstoloopbody(Testbed).
85
C
函数参数列表为空
#Emptyparameterlisttoprocedure/function.
188
C
函数参数列表申明不一致
#Parameterlistdeclarationsareinconsistent.
147
C
基本模块中使用#define定义
##defineusedinablock.
392
M
SWITCH结构含多个(大于1)DEFAULT
#Switchhasmorethanonedefaultcase.
115
M
函数返回类型不一致
#Functionreturntypeinconsistent.
116
M
函数和函数的原型的返回不一致
#Functionandprototypereturninconsistent.
117
M
函数和函数的原型的形参不一致
#Functionandprototypeparameterinconsistent.
19
M
函数参数超过7个
#Morethan***parametersinprocedure.
36
M
圈复杂度超过10
#CyclomaticComplexitymeasuregreaterthan***.
199
M
LCSAJ密度超过20
#LCSAJdensityexceeds***.
5
M
函数代码行超过200行
#Procedureexceeds***reformattedlines
注:
M的优先级高于C。