系列文章目录
LDRA Testbed软件静态分析_操作指南
LDRA Testbed软件静态分析_自动提取静态分析数据生成文档
LDRA Testbed软件静态分析_Jenkins持续集成(自动静态分析并用邮件自动发送分析结果)
LDRA Testbed软件静态分析_软件质量度量
LDRA Testbed软件静态分析_常见问题及处理
LDRA Testbed(TBrun)软件单元测试_操作指南、实例讲解
LDRA Testbed(TBrun)软件单元测试_常见问题及处理
LDRA Testbed(TBrun)软件集成测试_操作指南、实例讲解
LDRA Testbed(TBrun)软件集成测试_常见问题及处理
粉丝问题解答系列文章… …
文章目录
- 系列文章目录
- 前言
- 一、被测代码示例
- 二、单元测试配置
- 1、新建测试工程
- 2、配置编译器
- 三、编写测试用例
- 1、创建测试序列
- 2、创建测试用例
- 3、编写测试用例
- 〇、测试思路
- ①、测试用例1
- ②、测试用例2
- ③、测试用例3
- 四、执行测试用例
- 五、扩展分析
- 总结
前言
在之前的文章《LDRA Testbed(TBrun)软件单元测试_操作指南》中,已经讲解了如何使用TBrun进行软件单元测试的基本操作步骤,本篇文章将结合实例进行进一步讲解(详细的操作流程本文不再重述,如有不清楚的,可以结合上一篇文章一起来看)。
一、被测代码示例
本文以C语言编写的一个函数作为示例,被测代码如下:
int glob_out = 0;
void test_func(int input)
{
static int cnt = 0;
cnt++;
if(cnt <= 10)
{
glob_out = 1*input;
}
else if(cnt <= 20)
{
glob_out = 2*input;
}
else
{
glob_out = 3*input;
}
}
这个示例的被测函数非常简单,每调用一次被测函数test_func,其中的局部静态变量cnt会自增1,cnt在不同的取值范围时全局变量glob_out等于不同的值 。(示例代码,别纠结这段代码有没有具体意义😀)
我们都知道,函数内的局部变量我们没法通过外部输入对其直接赋值,那么这样一个被测函数,我们在做单元测试时,要如何覆盖上述所有的代码逻辑呢?下面就以此示例代码进行单元测试讲解。
二、单元测试配置
1、新建测试工程
在TBrun的上方菜单栏点击Source -> Single File(单个文件),在弹出的窗口中选择被测的源码文件:
在select file窗口选择被测源码文件:
导入被测源码文件后,TBrun会自动进行分析,分析完成后,会显示出file view和calls view窗口显示相关信息:
2、配置编译器
点击TBrun中上方菜单栏的Configure -> LDRA Testbed Configuration Options -> Switch Compiler进行编译器配置:
在弹出的Configure Compiler窗口中确认Default Compiler和Source Compiler,以选择MinGW200 GCC C/C++ v3.2编译器为例,切换编译器后点击OK即可:
需要注意的是:
1、Default Compiler和Source Compiler都应该选择目标编译器;
2、如果在列表中没有找到对应编译器,可以通过Add Compiler添加需要的编译器(需要先配置编译环境)。
三、编写测试用例
1、创建测试序列
在TBurn中是使用测试序列来管理测试用例和测试数据的,因此在新建测试用例前需要创建序列(为了方便管理,通常一个被测函数创建一个测试序列)。
在TBurn菜单中选择Sequence->New:
输入序列名称(为了方便管理,序列名以函数名命名,比如这里我们就命名为test_func),勾上Code Coverage选项(这样在运行测试用例后才会对代码覆盖率进行统计):
进行单元测试时,在Test Scenarios选项卡选择Isolate fully all code elements选项(完全隔离所有代码元素,即单元测试时,将本单元以外的调用全部默认打桩隔离):
点击“Continue”即可完成测试序列的创建。
2、创建测试用例
在TBurn界面的右上角文件视图窗口中,选中被测函数,鼠标右键->Create New Test Case创建测试用例:
弹出测试用例创建向导窗口,此时窗口会显示函数的相关信息,点击continue:
创建好测试用例后,会在左下角窗口中生成相应的测试用例条目,在右下角会显示该测试用例的默认输入输出列表,如下所示:
3、编写测试用例
〇、测试思路
首先我们需要先理清测试思路:为了要测到上述代码的所有逻辑,那么肯定要让局部静态变量cnt取到不同的输入值。但是对于局部变量我们无法对其直接赋值,应该怎么办呢?
仔细观察一下,被测函数test_func每调用一次,局部静态变量cnt会自增1,那么为了让cnt取到不同的值,只需要多次调用被测函数test_func即可。在TBrun中,为了实现多次调用被测函数,可以在测试用例的初始化代码中,手动添加相应代码。添加方式如下:
添加代码示例:
int i;
for(i=0;i<10;i++)
{
test_func(1);//call the test_func() 10 times, make the static variable 'cnt' to 10
}
在测试用例中插入上述初始化代码后,会在用例开头先调用10次test_func函数,此时cnt会自增为10。然后继续执行测试用例,还会再调用1次被测函数test_func,此时cnt会自增为11,因此会走“else if(cnt<=20)”为TURE的分支。
使用上述思路,然后再根据白盒测试中最常使用的语句覆盖、判定(分支)覆盖、MC/DC覆盖(上述示例代码不涉及MCDC)的覆盖率要求,编写以下测试用例。
①、测试用例1
初始化代码如下:
输入输出列表如下:
②、测试用例2
初始化代码如下:
输入输出列表如下:
③、测试用例3
初始化代码如下:
输入输出列表如下:
四、执行测试用例
执行上述3条测试用例,全部测试通过,语句、分支覆盖率均达到100%。
五、扩展分析
下面是Testbed(TBrun)根据测试用例的配置,自动生成出来的测试驱动程序:
我们可以看到,我们插入的初始化代码在测试用例函数的开头优先执行,这也就是为什么我们设置多次调用可以间接控制被测函数中局部静态变量的原因。千万不要忘了后面还会再调用1次被测函数test_func,这一次调用也会改变局部静态变量的取值。在自动生成出来的测试驱动程序中,调用被测函数前的各种操作,包括我们插入的初始化代码、形参取值、全局变量取值等,都应看成是我们设定的输入状态。
总结
本文以一个被测函数作为示例讲解了如何使用Testbed(TBrun)对涉及到局部静态变量的函数进行单元测试。本文的示例可能比较简单,但是思路、方法和流程都是通用的。后续文章将进一步讲解各种特殊场景的测试技巧。