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

相关推荐
Lost of 程序猿3 小时前
ASP.NET Core 测试实战:从单元测试到集成测试的全链路质量保障
单元测试·asp.net·集成测试
hh95019 小时前
gent Plan × DeepSeek Harness Agent 单元测试与行为回归框架
人工智能·数据挖掘·回归·单元测试·agent plan·adg成都社区·adg社区
测试19981 天前
接口自动化测试的全面解析与实战指南
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
川石课堂软件测试1 天前
自动化测试常见的异常处理
python·jmeter·mysql·docker·容器·单元测试·grafana
YakProject1 天前
如何让 AI Agent 跑得更快???
人工智能·测试工具·网络安全·agent·yakit·yaklang
测试19982 天前
Selenium 无法定位元素的几种解决方案
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
慧都小项2 天前
夜间Web回归跑到一半停了?TestComplete 15.83提升批量测试稳定性
前端·测试工具·数据挖掘·回归·汽车·web
Luminbox紫创测控2 天前
汽车前照灯阳光灼烧:光学热仿真与太阳光模拟器验证
人工智能·测试工具·汽车·安全性测试·测试标准
东莞市奥普新音频技术有限公司2 天前
国产音频分析仪怎么选?从性能参数、测试软件到自动化能力
人工智能·科技·测试工具·自动化·音视频·音频
flower_drop2 天前
测试 Android,不必再在 ADB、投屏、日志之间来回切换
测试工具