使用LDRA Testbed对代码进行单元测试
单元测试的主要操作:
⑴被测对象选择
⑵编译器的确认与切换
⑶单元测试模块Tbrun的打开
⑷测试序列(Sequence)的创建
⑸测试用例的创建
⑹测试用例的IO值设定
⑺测试用例中桩的设定
⑻测试用例的执行
⑼测试结果的查看
⑽测试用例的保存
⑾测试用例中增加用户全局变量
1
⑿测试用例创建向导中对全局数组和指针的处理
详细操作如下:
一、 测试对象的选择
在Testbed中C码中的“单元”就是一个函数,每次对一个函数的代码进行测试,测试时每次打开一个源文件。
打开程序LDRA Testbed,点击Testbed的菜单Fileselect file 通过文件浏览窗口打
开
文
件
要
分
析
的
文
件
,
如
C:\\LDRA_Workarea\\Examples\\C_testbed_examples\\Testrian\\Testrian.c 。
2
点击select之后,可以在工具快捷按钮栏的下方看见目前选择的文件
二、 编译器的确认与切换
在使用TBrun进行单元测试前需要先确认当前使用的编译器是否是正确的,如果不是正确的编译器可以切换为正确的编译器,其操作如下:
1. 确认编译器是否为目标编译器
在Testbed中右上角的” Options Window”中要确认”Current Compiler”和”Default Compiler”所显示的内容,需要注意两点,
3
“Current” 和 “Default”是否是目标编译器
“Current” 和 “Default”是否是一样的,应该相同才可以
2. 切换编译器
如果编译器不是用户想要的目标编译器需要切换,切换方法如下:
点击Testbed菜单Configure—>Switch Compiler,在弹出窗口的编译器列表中选择目标编译器,然后点击Select按钮即可。
4
如果编译器选项中的”Current Compiler”和”Default Compiler”不一致,也需要设置为一致的,
设置方式为点击Testbed菜单Configure—>Switch Compiler,在弹出窗口中点击Reset Current Set按钮来设置。
5
三、 单元测试模块Tbrun的打开
由Testbed进入Tbrun有三种模式,每种模式对应不同的测试类型,三种模式分别为:
“Integration Unit / Module Test”、”Isolation Unit / Module Test”和” Unit Test Only”。C代码的单元测试使用” Unit Test Only”模式,CPP的单元测试使用另外两种模式皆可。
在Testbed菜单TBrunUnit Test Only点击,即可进入Tbrun模块。
6
四、 测试序列(Sequence)的创建
在Tbrun中是使用测试序列(sequence)来容纳测试用例和测试数据的,进入Tbrun后第一步需要做的就是创建测试序列。建议每一个函数对应一个测试序列,便于用例管理。
在Tbrun的菜单Sequence-New点击,弹出测试序列创建窗口,在’Sequence name”下面需要用户写入Sequence的名字;窗体下面的选项卡设置如下,
在”Code Coverage”选项卡中把选择框 ”Code Coverage”选上,此项可自动计算覆盖率信息,在”Test Enviroment ”选项卡中把选择框”Create Dicitoary”、”Create User Globals”、”Create Stubs”,注意”Test build”选择框不要选,其他保持默认设置即可;然后点击”Continue”按钮即可。
7
五、 测试用例的创建
在Tbrun窗体的右上角File View窗口中,点击文件名能够展开显示文件中所包含的函数,把鼠标放到某个函数名上,右键弹出菜单点击”Create New Test Case”,
8
会弹出测试用例创建向导窗口
在此窗口中会显示函数的基本信息,可不用关注,直接点击按钮”Continue”向下进行,这样一个用例创建完成,可在用例管理窗口”Test Case View”中显示已经创建的用例,以数字编号用例,在”Variable I/O View”窗口中会显示此函数的输入输出参数。
9
六、 测试用例的输入输出参数IO值设定
测试用例的输入输出参数值的设定是测试的核心,在这一步决定了有什么样的输入和用例运行之后应该有什么样的输出(预期输出),从而实现了函数功能的验证。对于函数的输入输出不只有函数的参数,还包含函数内部使用的全局变量。
在”Variable I/O View”窗口中工具会显示出函数的参数和内部使用的全局变量,并会显示每个参数是输入还是输出,用户给每个参数赋值即可,注意输入以”I”标示的,输出是以”O”标示的,此处的输出是指预期的输出值。
对于标示为”I”的变量一定要有一个确定的值,要不让用例无法执行。
七、 测试用例中桩的设定
桩-----使用一个函数原型相同的空函数来代替原函数
10
如果被测函数中调用了其他函数,则被调用函数会被打桩,如果被调用函数的返回值影响了被测函数的分支流程,或被调用函数的动作影响了被测函数的分支流程,则需要对桩进行设置,一般设置桩的返回值即可满足。
在Tbrun的”Variable I/O View”中,双击”M Double-click to access”图标即可打开桩的属性设置其返回值等
在桩函数右键,弹出菜单,选择”Set Return Value On Exit”,弹出返回值设定窗口
11
在途中的”Value”设定返回值,点击”OK”。
八、 测试用例的执行
测试用例的IO设置和桩的设定之后,此用例就算构造完成了,接下来要做的就是执行用例,有两种运行方式,操作方法如下:
a. 一键式运行用例;在测试用例管理窗口中的空白处右键可弹出菜单,点击”Run Test Case Driver”即可运行用例。
12
b. 分步式执行用例;在测试用例管理窗口中的空白处右键可弹出菜单,按顺序点击
“Generate Driver”、”Build Driver”、”Execute Driver”、(“Split Regression Driver Output”)、”Process Regression Driver Output”,每执行一步如果执行成功则会在旁边以“√”提示,如果不成功则没有“√”,请排查原因。
九、 测试结果的查看
13
单元测试其测试结果由两部分构成:函数功能验证和函数覆盖率信息;
函数功能的验证是通过用例的执行之后的用例确认对话框中的Pass/Fail结果反映的。
函数的覆盖率信息可通过动态覆盖率分析报告来查看,在Tbrun的菜单ResultDynamic Coverage Analysis Report点击即可,此报告中包含整个文件中所有函数的语句、分支MC/DC覆盖率信息。还有一种图形化的方式显示函数的覆盖率信息,在Tbrun的用例管理窗口,选中用例然后右键在弹出的菜单中选择”View Flowgraph”即可打开覆盖率图形化显示窗体,图中绿色的代表已经覆盖了的,红色的代码未覆盖的
14
在弹出窗体中可通过菜单选择为图形添加分支跳转条件注释
十、 测试用例的保存
通过设计多个测试用例执行,函数的功能全部验证通过,并且覆盖率的值也达到了测试规范中的要求的值,此函数的测试就可以结束了,以便于以后对此函数进行回归测试,需要用户把用例保存起来,保存的操作如下:
在Tbrun的菜单SequenseExprot Test Case(TCF)点击,通过文件浏览窗体选择一个目录来保存对应的TCF文件。
至此单元测试的主要操作流程结束,下面介绍在测试用例创建过程中会常用到的几个
15
重要的操作处理。
十一、 测试用例中增加用户全局变量
单元测试每次通过Testbed来选择一个文件,而我们每个用例是针对一个函数的,所以在编译的时候只编译用户代码中的一个函数,如果此函数中使用了全局变量,且恰好此变量是用”extern”声明的,即全局变量身体的声明(定义)不在此文件内部,就需要用户自己在Tbrun中添加此全局变量的声明(定义)。操作如下:
在Tbrun的菜单Global VariablesCreate User Global点击即可弹出用户全局变量定义窗口,在窗口中添入”Name”和”Declaration Type”点击finish即可。
16
十二、 测试用例创建向导中对全局数组和指针的处理
1. 全局数组的处理
如果被测函数内使用的全局数据,在创建用例的时候用例创建向导会提示遇到全局数组,让用例来选择处理方式,一共有三种方式
“Add all elements to the test case” 把数组的所有元素都添加到用例的IO窗口中
“Add multiple elements to the test case” 把数组的部分元素添加到用例的IO窗口中
“Remove all elements from the test case” 把数组的所有元素从用例的IO窗口中删除
17
用户根据自己代码中对全局数组的访问情况自主选择相应的处理方式。
2. 指针的处理
a. 输入指针的处理
如果被测函数的参数中包含输入指针(此指针的所指向内容未被改变),在创建用例时用例向导会提示用户发现输入指针,让用户选择处理方式,一般选择第二种”Set input pointer to the address of entity”
在下面的空白处填入要指向的实体,也可以通过”Find”按钮选择已有的用户全局变量,或者”New”新建一个用户全局变量来指向。
b. 输出指针的处理
如果被测函数的参数中包含输出指针(此指针的所指向内容被改变),在创建用例时用
18
例向导会提示用户发现输出指针,让用户选择处理方式,一般选择第二种”Mapping”把此指针映射到某个实体,
点击next按钮后会出现映射窗口
19
在此窗口中选择”Map to Global Entity”,然后通过”Assign”来分配映射到那个全局变量,再让后点击”next”按钮;一步一步”next”或”continue”完成输出指针的处理。
20
因篇幅问题不能全部显示,请点此查看更多更全内容