软件单元测试工程模版化

news2024/11/13 11:08:28

一、简介  

     在汽车领域混了这么多年也做了不少项目,发现很多公司对软件单元测试和代码覆盖率测试根本不重视,或者开发流程就没有单元测试这个流程。但是有的客户需要评审单元测试这个流程,需要有相关的单元测试报告和代码覆盖率统计的报告。如果客户有这个要求就必须把这个开发流程重视起来,但是找了市面上很多工具并没有很满足要求的,既能实现单元测试又能顺便将代码的覆盖率统计出来。之前我写过一篇文章:温故而知新:gtest单元测试工具和lcov覆盖率统计工具的结合使用_gtest 覆盖率-CSDN博客 ,这篇文章主要介绍了如何将这两个工具结合起来作为单元测试工具。但是单元测试的过程中有的分支是没办法跑到的,比如需要依赖外部硬件的条件的情况下执行某个分支。例如有如下代码:

void control_flow(void)
{
	int a = 10, b = 20;
	stGPIO_Attrs gpio_attrs;
	GPIO_Config(1, 0, gpio_attrs);
	GPIO_OutLevel(1, 0, 0);
	//gpio为高电平执行乘法运算否则执行加法运算
	if(GPIO_GetPinLevel(1, 0) != 0) {
		func_add(a, b);
	}
	else {
		func_muti(a, b);
	}
}

  以上代码通过获取一个PIN脚的电平是高电平还是低电平执行不同的逻辑。但是单元测试工具一般是运行在windows环境下,硬件相关的代码是需要删除的。因此GPIO_GetPinLevel函数只能返回高电平或者低电平。因此在执行单元测试的时候只能跑一个分支,另一个分支无法被跑到。那么有没有办法让两个分支都跑到呢?答案是肯定的,那么就是对GPIO_GetPinLevel函数进行打桩。

二、函数打桩

函数打桩简单理解就是在实际运行代码的过程中用另一个函数的实现来替换实际函数的实现。比如上述GPIO_GetPinLevel函数就可以用下面的打桩函数来替换:

uint8_t GPIO_GetPinLevel_Stub(uint8_t gpio_port, uint8_t gpio_pin)
{
	if(s_test_case == 0)
	{
		return 0;
	}
	else if(s_test_case == 1) {
		return 1;
	}
	else {
		return 2;
	}
}

这样在程序运行的过程中就可以通过改变s_test_case变量的值来控制GPIO_GetPinLevel的返回值,从而获得高低电平。

三、该模版化工程的亮点

(1)基于gtest和lcov实现的既可以在实现单元测试的同时统计代码行覆盖率,并生成可视化报告。

(2)该工程提供了打桩功能可以方便用户在函数中制造各种异常case,人为制造在实际中跑不出来的情况。

(3)无论是单片机程序还是大型OS的程序都可以很简单的移植到该工程执行测试。

(4)生成的单元测试报告及覆盖率报告都是可视化的,该工程跑在ubuntu linux虚拟机上,环境搭建简单,移植方便,只需要将代码分别放在下图的Src和Inc目录下并编写测试用例即可运行。单元测试用例编写规则和gtest一致。

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        图1    单元测试工程模版主目录
 

                                                        图2   单元测试用例目录

                                                       图3  单元测试运行界面

 

                                                        图4  代码接口和行覆盖率统计结果

                                                             图5  单元测试结果报告 

 

                                                    图6  单元测试用例编写用例 

                                                    图7  具体接口覆盖率情况

注:有单元测试需要该模版的私信了解下

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

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

相关文章

百度 AI Studio 脚本任务篇,它不同于notebook任务是支持免费的, 脚本任务是需要算力卡的,更好的算力 支持四张显卡,

aistudio 脚本任务是需要算力卡的,是收费的一个项目,估计是运行效率更高,支持4张显卡,同时计算。 # -*- coding: utf-8 -*- """ 空白模板 """ ###### 欢迎使用脚本任务,首先让我们熟悉…

计算机毕设选题推荐-基于python的豆瓣电子图书数据可视化分析

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的豆瓣电子图书数…

插入排序代码实现(java)

简介: 也是一种简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增的有序表 说明: 拿一维数组来说,可以把第一个元素看成一个有序表,后面的元素看成无序表&am…

《中文Python穿云箭量化平台二次开发技术08》获取大盘涨跌家数、平均股价数据等来判断市场涨跌趋势,并在策略中自动控制多空交易

《中文Python穿云箭量化平台》是纯Python开发的量化平台,因此其中很多Python模块,我们可以自己设计新的量化工具,例如自己新的行情软件、新的量化平台、以及各种量化研究工具。 穿云箭自带指标公式源码运行模块,可以为其他量化平台…

莫比乌斯反演总结

目录 前置知识1.1 线性筛 (欧拉筛)1.2 整除分块 (数论分块)引理 1引理 2引理 3实现例 1例 2例 3例 4 1.3 数学知识积性函数莫比乌斯函数狄利克雷(Dirichlet)卷积 莫比乌斯反演2.1 公式2.2 常用~(唯一)~结论2.3 例题例 1例 2例 3例 4例 5练习 1练习 2练习 3练习 4 懵逼乌斯反演总…

配置nginx安全连接ssl(购买域名、获取ssl证书)

以前了解过ssl配置比较麻烦,需要弄挺多东西。 1、购买域名、获取ssl证书 2、安装nginx的ssl模块 3、配置config 1、购买域名、获取ssl证书 可以在腾讯云、阿里云购买域名,然后申请免费的ssl证书,因为免费的证书需要域名才能申请&#xff0…

docker安装配置、docker命令

一、CentOS7安装docker 1、安装 Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。 卸载旧docker 如果之前安装过旧版本的Docker,可以使用下面命令…

Codeforces Round 964 (Div. 4) A-E Java题解

比赛地址 Dashboard - Codeforces Round 964 (Div. 4) - Codeforces A题 签到题 给一个两位数 求各位上的数字和 直接对10取余加上本来的数除以10 // 注意类名必须为 Main, 不要有任何 package xxx 信息 // package Dduo; import java.io.*; import java.math.*; import j…

22:差分线规则

1.那些线是差分对: ①有些特定模块就是差分线:USB,HDMI, 以太网口,LEDS等 设置差分对 Panel打开PCB 输入﹢和- 点击执行 对90欧姆差分对和100Ω差分对进行分类 设置差分对线宽 ①90ohm 由excel可知&a…

孩子自闭症的主要表现:探寻理解之门

自闭症,也称为孤独症,是一种复杂的神经发展障碍,它影响着孩子的社交互动、沟通能力以及行为模式。当家长注意到孩子出现自闭症倾向时,及时识别并寻求专业帮助至关重要。以下是孩子自闭症的一些主要表现,希望能为家长提…

西安电子科技大学研究生新生大数据

西安电子科技大学研究生新生大数据,来自卓越工程学院—杭州研究院 杭研不少来自双非院校,西电也不怎么歧视双非的

游戏开发设计模式之模板方法模式

目录 模板方法模式在游戏开发中的具体应用案例是什么? 如何在不同类型的游戏(如角色扮演游戏、策略游戏等)中实现模板方法模式? 模板方法模式与其他设计模式(如观察者模式、状态模式等)相比,…

实战项目:俄罗斯方块(二)

文章目录 🍊自我介绍🍊俄罗斯方块数据存储三维数组的简单介绍俄罗斯方块数组的设计类型的设计初始值的方块库的设计输出指定位置的图形输出每种图形及其转换形式代码 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏…

MySQL出现锁等待Lock wait timeout exceeded该如何快速解决

目录 一、前言 二、锁等待是如何产生的? 三、如何避免锁等待? 四、出现锁等待,如何快速解决? 设置合理的锁等待超时时间 使用DBdoctor及时观测锁等待数据 五、总结 一、前言 在使用MySQL等数据库处理业务时,锁…

面对自闭症的孩子:理解、关爱与支持

自闭症,这个看似遥远却又时常出现在我们生活中的词汇,它影响着无数家庭和孩子。面对自闭症的孩子,我们或许会感到困惑、无助,但更重要的是,我们要给予他们理解、关爱与支持。 我们要做的是深入理解自闭症。自闭症是一种…

Linux创建sysfs属性节点 - DEVICE_ATTR宏、device_create_file()、sysfs_create_group()

目录 简介: 一、DEVICE_ATTR介绍 1、DEVICE_ATTR宏 1.1 参数说明 1.2 调用方法 二、sysfs创建属性文件 1、创建一个sysfs属性文件 1.1 device_create_file()函数 1.2 device_create_file()实例 2、创建多个sysfs属性文件 2.1 sysfs_create_group()函数 2…

AI少女/HS2甜心选择2 仿崩坏3卡系列全合集打包

内含AI少女/甜心选择2 仿崩坏3系列全合集打包共11张 内含:月魄装 幽兰黛尔幽兰黛尔薪炎之律者青鸟之庭帕朵菲莉丝雷电芽衣校服布洛妮娅八重樱 冰海琴音爱衣 悠闲旋律爱莉希雅EVA 明日香。 下载地址:https://www.51888w.com/241.html 部分演示图&#…

java构建工具-maven的复习笔记【适用于复习或者初步了解】

🤹‍♀️潜意识起点:个人主页 🎙座右铭:得之坦然,失之淡然。 💎擅长领域:前端 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我持…

鸿蒙UIAbility组件进阶

鸿蒙UIAbility组件进阶 AbilityStage基本概念生命周期使用方式 UIAbility组件间交互启动应用内的UIAbility启动应用内的UIAbility并获取返回结果启动UIAbility的指定页面调用方目标UIAbility冷启动目标UIAbility热启动 AbilityStage 基本概念 在了解AbilityStage之前&#xf…

Promise 工具箱:手写实现静态方法的完全指南

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 Promise有很多静态方法,本文就来分享下如何实现这些静态方法。 目录 …