LDRA Testbed(TBrun)软件单元测试_实例讲解(局部静态变量)

系列文章目录

LDRA Testbed软件静态分析_操作指南

LDRA Testbed软件静态分析_自动提取静态分析数据生成文档

LDRA Testbed软件静态分析_Jenkins持续集成(自动静态分析并用邮件自动发送分析结果)

LDRA Testbed软件静态分析_软件质量度量

LDRA Testbed软件静态分析_常见问题及处理

LDRA Testbed(TBrun)软件单元测试_操作指南、实例讲解

LDRA Testbed(TBrun)软件单元测试_常见问题及处理

LDRA Testbed(TBrun)软件集成测试_操作指南、实例讲解

LDRA Testbed(TBrun)软件集成测试_常见问题及处理

粉丝问题解答系列文章... ...


文章目录


前言

在之前的文章《LDRA Testbed(TBrun)软件单元测试_操作指南》中,已经讲解了如何使用TBrun进行软件单元测试的基本操作步骤,本篇文章将结合实例进行进一步讲解(详细的操作流程本文不再重述,如有不清楚的,可以结合上一篇文章一起来看)。


一、被测代码示例

本文以C语言编写的一个函数作为示例,被测代码如下:

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中,为了实现多次调用被测函数,可以在测试用例的初始化代码中,手动添加相应代码。添加方式如下:

添加代码示例:

c 复制代码
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)对涉及到局部静态变量的函数进行单元测试。本文的示例可能比较简单,但是思路、方法和流程都是通用的。后续文章将进一步讲解各种特殊场景的测试技巧。

相关推荐
Elastic 中国社区官方博客2 小时前
使用真实 Elasticsearch 进行更快的集成测试
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·集成测试
暮春二十四8 小时前
关于用postman调用接口成功但是使用Java代码调用却失败的问题
java·测试工具·postman
看山还是山,看水还是。10 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
清尘沐歌11 小时前
推荐一款好用的postman替代工具2024
测试工具·postman
清尘沐歌12 小时前
有什么好用的 WebSocket 测试工具吗?
websocket·网络协议·测试工具
清尘沐歌14 小时前
2024 年 Postman 进行 Websocket 接口测试的图文教程
测试工具·postman
清尘沐歌14 小时前
除了 Postman,还有什么好用的 API 管理工具吗?
测试工具·postman
惜.己16 小时前
Jmeter中的监听器(一)
测试工具·jmeter·1024程序员节
qq_49244844617 小时前
selenium 控制内嵌table滚动条的方法
selenium·测试工具
花下的晚风21 小时前
单元测试时报错找不到@SpringBootConfiguration
java·开发语言·单元测试