LDRA Testbed(TBrun)软件单元测试_实例讲解(对多次调用的函数打桩)

news2024/11/15 21:09:24

系列文章目录

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
  • 四、执行测试用例
  • 五、扩展分析
  • 总结


前言

在之前的文章《LDRA Testbed(TBrun)软件单元测试_操作指南》中,已经讲解了如何使用TBrun进行软件单元测试的基本操作步骤。本篇文章将结合实例进一步讲解被测函数中包含多次调用其他函数时,如何对其打桩来实现测试目的(详细的操作流程本文不再重述,若有不清楚的,可以结合之前的操作指南一起来看)。


一、被测代码示例

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

int get_time_tick_now(void);
void file_operations(void);

int test_func()
{
	int ret;
	int time_tick_1,time_tick_2;
	
	time_tick_1 = get_time_tick_now();//获取当前时间1
    file_operations();//进行文件操作
    time_tick_2 = get_time_tick_now();//获取当前时间2

	if(time_tick_2 - time_tick_1 > 100)//如果文件操作的时间过长,则返回异常值-1,否则返回1
	{
		ret = -1;
	}
	else
	{
	    ret = 1;
    }
	
	return ret;
}

这个示例的被测函数非常简单,分别获取文件操作前后的时间,计算文件操作的耗时。如果耗时过长,则返回-1;如果耗时正常,则返回1 。(示例代码,别纠结这段代码有没有具体意义😀)
我们都知道,做单元测试时,被测函数如果有调用其他函数,那么可以将其他被调函数打桩。从而使测试时不用关注原调用函数的具体功能,可以专注于被测函数本身的功能逻辑。常规的函数打桩比较好操作,比如有返回值的函数可以设置其返回值,或者void类型的函数可以直接打空桩等。上述代码中有点特别,get_time_tick_now()函数被调用了两次,每次都需要取其返回值。很显然,常规的打桩让其返回一个固定值无法达到测试目的,我们需要它每次返回不同的值。那么在Testbed(TBrun)中应该如何操作才能达到上述测试目的呢?下面就以此示例代码进行单元测试讲解。

二、单元测试配置

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、编写测试用例

〇、测试思路

首先我们需要先理清测试思路:为了要测到上述代码的所有逻辑,那么肯定要让get_time_tick_now()函数第1次和第2次被调用时返回不同的值,应该怎么办呢?
在对test_func()函数进行单元测试时,一般来说,我们需要对它调用的get_time_tick_now()函数打桩。为了让get_time_tick_now()函数在不同的调用次数时返回不同的值,我们可以在桩函数中插入测试代码。添加方式如下:
进入测试用例的桩函数管理界面,可在Variable I/O View界面双击Managed Stubs进入:
在这里插入图片描述
也可以选中测试用例,右键选择Stub Management进入:
在这里插入图片描述
进入Specify Stub Checking界面后,选中需要进行打桩的函数get_time_tick_now(),右键选择Set Code Segment:
在这里插入图片描述
在弹出的Code Segment设置窗口中,添加桩函数代码:
在这里插入图片描述
添加代码示例:

static int cnt = 0;

cnt++;
if(cnt == 1)
{
    return 100;
}
else if(cnt == 2)
{
    return 199;
}

对get_time_tick_now()打桩并添加上述桩函数代码后,第1次调用get_time_tick_now()时会返回100,第2次调用get_time_tick_now()函数时会返回199,以此类推,可按照此思路设置该函数被调用任意次数时的不同返回值或者进行其他逻辑操作。
使用上述思路,然后再根据白盒测试中最常使用的语句覆盖、判定(分支)覆盖、MC/DC覆盖(上述示例代码不涉及MCDC)的覆盖率要求,编写以下测试用例。

①、测试用例1

桩函数设置如下:
对file_operations()函数打空桩,对get_time_tick_now()函数打桩并插入如下代码:
在这里插入图片描述
输入输出列表如下:
在这里插入图片描述

②、测试用例2

桩函数设置如下:
对file_operations()函数打空桩,对get_time_tick_now()函数打桩并插入如下代码:
在这里插入图片描述
输入输出列表如下:
在这里插入图片描述

四、执行测试用例

在这里插入图片描述
执行上述2条测试用例,全部测试通过,语句、分支覆盖率均达到100%。

五、扩展分析

我们打开Testbed(TBrun)根据测试用例的配置自动生成出来的测试驱动程序,在其中找到被打桩后get_time_tick_now()函数如下:
在这里插入图片描述
我们可以看到,我们对用例1、用例2设置的桩代码都生成到了get_time_tick_now()桩函数中,并通过ldra_qq_test_case_number识别了用例编号,避免了冲突。


总结

本文以一个被测函数作为示例,讲解了如何使用Testbed(TBrun)对涉及到多次调用其他函数的被测函数进行单元测试。本文的示例可能比较简单,但是思路、方法和流程都是通用的,希望对大家有所帮助。后续文章将进一步讲解各种特殊场景的测试技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2117577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv10改进:CA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,目标检测效果优于SE和CBAM注意力)

YOLOv10改进:CA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码) 如果实验环境尚未搭建成功,可以参考这篇文章 ->【YOLOv10超详细环境搭建以及模型训练(GPU版本)】 文章链接为&…

电脑pe是什么意思_电脑pe系统作用详细分析

有些小白很好奇,电脑pe是什么意思?所谓的电脑pe系统其实就是当我们的电脑出现问题而不能进入正常系统时候的一种“紧急备用”系统。如果需要重装操作系统的话,以往采用光盘使用的比较多,随着技术的进步,用u盘制作一个pe启动盘去安…

Kubernetes 系列 | k8s入门运维

目录 一、K8S集群搭建1.1 部署方式1.2 了解kubeadm1.3 部署流程1.3.1 初始化配置1.3.2 安装容器运行时1.3.3 安装K8S软件包1.3.4 创建集群 二、集群高可用1.1 集群高可用-堆叠1.2 集群高可用-集群外etcd 三、Pod运维3.1 Pod运维3.2 Pod的生命周期3.3 Pod状况3.4 Pod阶段3.5 容器…

【C++前缀和】3212. 统计 X 和 Y 频数相等的子矩阵数量|1672

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode3212. 统计 X 和 Y 频数相等的子矩阵数量 难度分:1672 给你一个二维字符矩阵 grid,其中 grid[i][j] 可能是 ‘X’、‘Y’ 或 ‘.’&a…

中秋佳节,科技好礼献团圆!五款数码好物大推荐

中秋节的到来,总是让人充满了对团圆和美好生活的向往。在这个家人团聚、朋友欢聚的美好时刻,除了享受月饼和团圆饭,还可以通过一些先进的数码好物,提升节日的愉悦感和生活的舒适度。从提升运动体验的南卡Runner Pro5,到…

Windows系统 安装 Nacos

使用说明:安装 Nacos 服务端,以单机模式启动,不用集群。 一、下载Nacos Nacos Server 下载 | Nacos 官网 下载解压后: bin:启动脚本;conf:配置文件 这个文件可以修改端口、增加数据库连接等配…

从零到一:为未上架APP开通微信商户支付服务的步骤详解

随着移动支付的普及,微信商户支付已成为众多商家不可或缺的一部分。然而,对于某些仍处于开发阶段或特殊需求下的APP来说,它们可能尚未在应用商店上架,但仍需接入微信支付功能以满足用户需求。本文将为您提供一份详细的微信商户支付…

2024年印尼金融科技报告解读(1) | 印尼金融科技发展现状与挑战

概述 金融科技的创新正加速全球金融普及和经济增长,尤其在东南亚,其影响尤为显著。 印尼作为该区域的经济龙头,凭借其庞大的人口基数和独特的地理位置,对"非接触式"服务和中小企业融资的需求迅猛增长,成为数…

mp3和mp4区别是什么?音视频转换,用这2个工具就够了

在刷视频的时候,在看电影的时候,在听歌的时候……我们经常能听到“mp3”、“mp4”这两种格式的名字。它们是什么格式?mp3和mp4区别是什么?我们能做什么? mp3是一种流行的音频编码格式,以其高效的压缩算法著…

屏幕空间UV 警戒线

屏幕空间UV 警戒线 屏幕UV已经抗锯齿

ueditor抓取图片

在ueditor.all.js文件中 修改catchremoteimage方法 原来的: 修改后: function catchremoteimage(imgs, callbacks) { //创建一个请求var oReq = new XMLHttpRequest() //获取请求地址前缀,根据自身项目获取const baseURL = http://uat.********* //url为请求地址根路径+具…

openGauss 数据库管理工具:DataKit 6.0 部署与配置实战

目录 一、DataKit简述 二、部署概要 三、系统规划 四、软件环境准备 1、关闭防火墙 2、配置时间同步 3、禁用 SELinux 4、关闭RemoveIPC 5、字符集设置 6、安装依赖包 五、openGauss DataKit部署与配置 1、openGauss 安装与配置 1.openGauss参数配置 2.重启 open…

React Native 0.76,New Architecture 将成为默认模式,全新的 RN 来了

关于 React Native 的 New Architecture 概念,最早应该是从 2018 年 RN 团队决定重写大量底层实现开始,因为那时候 React Native 面临各种结构问题和性能瓶颈,最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始,New A…

第三次去银行办事,核心是犯了抓不住重点这个毛病

手机银行不小心输错了两次密码,然后就限制了交易,只能在柜台操作。 由此引发了比如提示密码错误、定期转活期、转账等功能的异常。 前两次去银行,竟然只是去解决了这些附带问题。 核心问题是限制非柜面交易啊。 哎 这就是抓不住重点&…

数据结构-堆-详解

数据结构-堆-详解 1.性质大根堆小根堆 2.实现2.1struct Heap、HeapInit、HeapDestroy2.2HeapPushAdjustUp 2.3HeapPopAdjustDown 2.4HeapTop、HeapSize、HeapEmpty 3.应用3.1堆排建堆排序 3.2TopK问题 1.性质 堆是一种特殊的完全二叉树,其父节点总是不大于/不小于 …

手把手教你使用亚马逊云服务器创建EC2实例

陈老老老板🤴 🧙‍♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🧙‍♂️本文简述:如何使用亚马逊云服务器创建EC2实例。 🧙‍♂…

CGAL 概念模型及Traits 概述

CGAL 概念模型及Traits 本节释了概念Concepts 、模型Models以及Traits类的含义。 CGAL Concepts and Models 概念Concepts是对类型的一组要求,即它具有特定的嵌套类型、特定的成员函数或具有特定的以该类型为参数的自由函数。概念的模型 Models是一个满足概念需求…

大厂最爱问的MVCC,到底是个啥?

引言 多版本并发控制(MVCC)是一种用于提高数据库并发性能的技术,尤其在处理高并发读写操作时极为有效。MVCC通过维护数据的多个版本来避免读写冲突,使得读操作无需阻塞写操作,写操作也不会影响读操作。下面&#xff0…

内网环境使用Docker部署Qwen2模型-vLLM篇

在此之前,我们已成功利用Docker与Ollama框架,在内网环境中部署了Qwen2模型。下面我们再来看一下使用Docker与vLLM框架部署Qwen2模型。 准备vLLM镜像 在一台具备网络环境的机器上执行以下命令,拉取vLLM的镜像: # 官方镜像 docke…

探索MySQL数据查询语言的无限魅力:精准检索,驾驭数据海洋的钥匙

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…