汽车软件单元测试的要点与意义

news2024/11/29 14:52:01

 测试是一个非常基础的概念,这种基础让大家可以随意在它前面添加各种定语。

  尽管这种添加的背后多数是不同的分类维度,但让测试本身成为了繁杂概念的集合,这也让我们总有种无法把握的烦躁感。

  单元测试就是这堆让人烦躁的繁杂概念之一。

  1、3种软件测试分类及单元测试的定义

  如前所述,软件测试的分类维度非常多,我们仅从以下常见的3种方式阐释:

  按是否执行软件分类:静态测试和动态测试,单元测试横跨二者。

  按是否关注内部代码分类:白盒测试黑盒测试,单元测试属于白盒测试。

  按汽车软件集成层次分类:从单元测试到整车验收有各级测试(参考《汽车软件集成的5个层次》),单元测试属于最低一个层级。

  当我们去网上搜索单元测试的定义时,往往会看到类似这样的说法,“单元测试是指对软件中的最小可测单元进行测试”。

  但这个描述只能是一个正确的定义,仍然很难把握。什么叫最小可测单元?一个函数?一个类?一个.c?还是一个功能模块?

  争论一直存在。

  搁置争议,我们只看汽车行业。按照惯例或标准,广义上,可以把软件集成测试以下所有测试都看作是单元测试。

  2、单元测试的4种类型

  进一步地,在汽车软件领域,我们可以将单元测试细分为代码评审、静态分析、单元(代码功能)测试和单元(代码覆盖度)测试。

  前两种属于静态测试,后两种属于动态测试。

  2.1 代码评审

  根据形式或正式程度上的差异,代码评审会分成很多名目,比如:

  ·走查(Walk Through)

  · 同行评审(Peer Review)

  · 代码评审(Code Revew)

  · 结对编程(Pair Programming)

  · 代码审查(Code Inspection)

  但简单来说,代码评审就是人看,一个或一组人面对可阅读的源代码(有时也需要结合需求或软件文档),进行随意的或正式会议下的检查。

  可能会识别出如下的一些问题:

  · 无注释的代码

  · 不可达的条件路径

  · 太复杂的循环嵌套

  · 无返回值的分支

  · 未初始化的变量

  · 空指针的引用

  · 不规范的命名规则

  ......

  理论上,对于手写代码的合理性与正确性,他人及更有经验的他人去检查一遍,有一定的意义,甚至某些案例下,会胜过后期测试。

  比如,开发调用了名称相似的变量,这种错误可能在流到很后期才会被探测到。

  实际上,代码评审也同其他评审类似,都是无奈为之而又常常流于形式的手段。

  解决这类问题的方法不外乎3个:

  · 用更负责且有经验的人

  · 提升形式的强制性

  · 积累充足的Checklist

  其中,在下一节静态分析工具使用后,人的经验就成为了代码评审存在的最大意义。

  总之,代码评审不算是典型的测试,但作为编码后的第一道屏障,仍然有必要存在。

  2.2 静态分析

  相较于人工代码评审的低效,静态分析是依赖于诸如Parasoft、Polyspace、Coverity等工具的自动化分析。

  因为不需要执行软件,所以静态分析仍然不需要二进制代码或可执行程序。

  静态分析工具通常主要支持以下两种分析类型:

  语法分析:主要检查是否符合编程语言的语法规则,如MISRA C。

  代码路径分析:主要包括控制流分析(如语句条件分支、循环迭代次数)、数据流分析(如变量值的传递)、代码复杂性(如圈复杂度、路径长度)、依赖关系(如函数之间的调用、模块之间的依赖)等。

  当对部分或全部代码进行静态扫描后,会得到基于内置规则集的判定结果,一般会包含分等级的规则违反情况。

  如MISRA C: 2012分为强制(Mandatory)、必要(Required)和建议(Advisory)。

  通常,强制项必修,必要项需要进行评审。但有时候,涉及到第三方标准库时,就无法按照这个规则执行了,具体还是要看产品类型(如是否涉及信息安全)和公司要求。

  此外,由于编译器基本也都具备类似的代码检查作用,静态分析工具也可以理解为编译器的扩展。

  因此,我们也会把编译器警告或错误作为要处理的条目。

  2.3 单元(代码功能)测试

  这部分测试的源头是软件详细设计,测试重点从代码写得漂不漂亮转移到代码写得有没有用,也就是是不是符合了设计。

  汽车软件用例的设计,一般有如下两种密切相关的方法:

  2.3.1 等价类划分法

  等价类划分是将软件单元的输入数据划分为等价数据(即可以导致相同的输出)的分区,而后用测试用例去至少覆盖每个分区一次。

  其背后的诉求是,通过划分输入数据的类别来限定测试用例的数量。

  举一个例子。

  一个函数输入的范围是1~100,如果要穷举式测试,我们需要为输入参数编写100个测试用例。

  而使用等价类划分法的话,测试用例就可以分为三类:

  · 有效(1~100)

  · 以下无效(例如0)

  · 以上无效(>100)

  于是,用例也就可以缩减为3个。

  可能有人很快会有疑问,按照等价输入数据进行测试,会不会有遗漏呢?

  没错,尤其是边界值处很容易出错。这就是第二个方法要解决的问题。

  2.3.2 边界值法

  仍然以上一个案例展开。

  使用边界值法的话,我们可为等价类划分法定义的测试用例作如下补充:

  刚好在边界(1,100)

  刚好在边界以下(0,99)

  刚刚越过边界(2,101)

  经过两种方法的结合,缺陷发现的能力会进一步提高。

  2.4 单元(代码覆盖度)测试

  单元(代码功能)测试完成后,够了吗?不够。

  我们没测出bug,代表的不是软件没bug,而是没测够。

  没测够的典型表现是测试用例对代码的覆盖程度不足,这就是本节要处理的问题。

  主要的代码覆盖度测试类型包括以下4种,严格程度从上到下依次增强:

  语句覆盖(Statement Coverage):这是最基本的覆盖度类型,它确保每个代码语句至少执行一次,100%的语句覆盖率可以保证没有死代码,属于入门级别的测试。

  分支覆盖(Branch Coverage):分支覆盖确保每个分支语句(通常是if语句)都被覆盖到,即每个分支的真和假两种情况都被测试到,有助于揭示一些逻辑错误,如if a and b then...,用例为a真+b真(分支为真)、a真+b假(分支为假,与其他条件组合等价)即可100%

  条件覆盖(Condition Coverage):条件覆盖要求每个分支语句的每个条件都被覆盖,即每个条件的真和假两种情况都被测试到,它比分支覆盖更为严格,因为它会关注条件的组合覆盖,如if a and b then...,用例为a真+b真、a真+b假、a假+b真、a假+b假才可100%。

  修改条件/判定组合覆盖(Modified Condition/Decision Combination Coverage):这一级别的覆盖要求同时满足条件覆盖和判定覆盖,以确保条件和判定之间的组合覆盖,是一种更加严格的覆盖度测试。

  不同的项目和产品可能需要不同类型的代码覆盖度测试。

  通常,基础的覆盖度(如语句覆盖和分支覆盖)是必要的起点,而在需要更高可靠性和安全性的项目中,可能会选择更严格的MC/DC覆盖度,比如,涉及ASIL D的模块。

  3、单元测试意义的思考

  说意义的话,我们可以很快说出一大堆,bug提前暴露、提升软件质量、软件更加健壮、利于重构、清除技术债务、积累组织资产......

  问题在于,在不好言明的价值和巨大的交付压力之下,单元测试太容易被权衡掉了,谁还没有个意义呢?

  实际上,管中窥豹,对这类重要但不紧急事情的意义的探讨会折射出很多面的信息,比如下面这个算式。

  自动化的程度+对软件的理解+产品的竞争力+公司的文化+行业的生态=单元测试的意义。

  4、全文小结

  本文主要在讲单元测试的一些基本概念和应用场景。

  首先,从是否执行软件、是否关注内部代码和汽车软件分层集成这3个方面解释了单元测试的特点。进而,引申出汽车软件单元测试的概念。

  接着,将单元测试细分为代码评审、静态分析、代码功能测试、代码覆盖度测试,并分别进行了描述。

  由于单元测试离客户需求太远,往往被务实的我们忽略,如何看待其价值需要探讨,第3小节对此做了简单分析。

  5、写在最后

  不只是单元测试,软件大举进入汽车行业的过程中,未来无形不可见和当下有形可见的价值冲突持续在上演。

  如何把握向左还是向右的分寸始终是一个巨大的决策考验。

 感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

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

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

相关文章

Linux文件系统目录结构

典型的Linux文件系统目录结构的列表 典型的Linux文件系统目录结构的列表。每个目录都有其特定的用途: /bin: 存放系统引导和修复所需的二进制可执行文件,如ls,cp,mv等命令。 /boot: 存放操作系统引导文件,例如内核和…

2023世界传感器大会开幕,汉威科技多领域创新产品引瞩目

11月5日,2023世界传感器大会在郑州国际会展中心正式拉开帷幕。据悉,本次大会由河南省人民政府、中国科学技术协会主办,郑州市人民政府、河南省工业和信息化厅、河南省科学技术协会、中国仪器仪表学会承办。 大会由“一会一赛一展”组成&#…

Python新手必读:容器类型使用的实用小贴士

更多资料获取 📚 个人网站:涛哥聊Python Python提供了多种容器类型,如列表(List)、元组(Tuple)、集合(Set)、字典(Dictionary)等,用于…

NVM安装与配置(管理node版本)

NVM安装与配置(管理node版本) 一、安装NVM 下载安装 NVM解压后点击exe文件进行安装:点击下一步安装到 D:\NVM 下先在D:\NVM 下创建nodejs文件夹,然后将路径设置如下:点击next 一直点击 完成安装;地方是非得失范德萨范德萨发![在…

如何建设企业集成中台

企业的信息化建设是伴随企业发展不断延伸、不断升级的过程,而随着信息化体量不断增大,复杂繁多的业务系统往往又成为信息化建设的瓶颈,而为了消除瓶颈,更便捷地打通系统的关联,针对企业实际业务建立集成中台则是非常有…

C语言基础篇2:数组

1 一维数组 数组是一个由若干同类型变量组成的集合,引用这些变量可以使用同一个名字。数组均由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应数组的最后一个元素。 1.1 一维数组的定义和引用 一维数组示意图如下&#xf…

海康威视解码器维修DS-6900系列DS-6916UD

海康威视解码器常见维修型号:DS-6916UD/DS-6901/DS-6904/DS-6908/DS-6910/DS-6912UD/6A16 DS-6A16UD 产品类型:视音频解码器纠错 I/O接口:输入 DVI-I纠错;输出 VGA,BNC纠错;音频输入 HDMI纠错 产品特性 …

CY5-COOH脂溶性羧基荧光染料1032678-07-1

Cyanine5-COOH是一种荧光染料,它CAS号1032678-07-1,分子式为C32H39ClN2O2,分子量为519.12。Cyanine5-COOH具有良好的光稳定性和荧光亮度,可以用于生物学研究、诊断、药物筛选等领域。 Cy5-COOH (来自星戈瑞的花菁染料) 含有羧基官…

【源码篇】基于SSM开发的社区论坛系统

系统介绍 基于SSM开发的社区论坛系统是一个分享创造的开发者社区,是高品质的开发者社区,致力于为开发者提供一个分享创造、结识伙伴、协同互助的平台。 系统功能说明 1、游客模式下可以查看系统发布的话题、及用户参与的讨论,可以查看系统…

在Linux中安装宝塔面板

在公网为x.x.x.x的服务器上安装宝塔面板 安装宝塔面板 第一步,下载安装宝塔面板。 命令:cd /usr/local/src wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 注意:需要等几分钟来下载宝塔面…

【STM32】Systick定时器

一、STM32的5种定时器简介 1.独立看门狗(IWDG) VS 窗口看门狗(WWDG) 1.独立看门狗(IWDG) 独立看门狗:当没有到设定时间之前,给它喂了狗,就会回到初始值。 2.窗口看门狗…

JAVA对象大小的获取

1. Java 对象的内存布局 Java的实例对象、数组对象在内存中的组成包括如下三部分:对象头Hearder、实例数据、内存填充。示意图如下所示 对象头 其主要包括两部分数据:Mark Word、Class对象指针。特别地对于数组对象而言,其还包括了数组长度…

figma-如何批量修改字体

一.选择字体 二.批量替换 编辑—>替换相同字体

3.3、Linux项目自动化构建工具make/makefile

个人主页:Lei宝啊 愿所有美好如期而遇 目录 背景 依赖关系 依赖方法 实例代码 原理 项目清理 背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力再一个,我们平时使用的集成开发环境,创建一个工程…

[量化投资-学习笔记006]Python+TDengine从零开始搭建量化分析平台-MACD

在上一章节介绍了 EMA 均线的计算,本节主要介绍均线的进化形态之一:MACD MACD (Moving Average Convergence / Divergence) 指数平滑移动平均线。MACD 是通过计算不同时间的 EMA 的差值俩判断价格趋势。 MACD 包括 3 个值: 长短期 EMA 差值…

信号上的串联电阻是如何改善信号质量的

一般我们在进行PCB设计时可能会留意到有些信号会串联一个电阻,那么大家是否有想过所串联的电阻是有什么作用呢? 大家可以看一下下面图示的案例,信号是从CPU处出来再接到DDR颗粒的,每一个DDR数据线都有串联一个电阻,其…

高速串行协议——Aurora

Aurora简介 Aurora 协议是一个用于在点对点串行链路间移动数据的轻量级链路层协议,并为物理层提供透明接口,让专有协议或业界标准协议上层能方便地使用高速收发器。 Aurora通信模型 在发送端,用户端应用程序可以通过AXI总线接口实现与Aurora…

虹科示波器 | 汽车免拆检测 | 2017款长安福特翼虎车发动机故障灯异常点亮

一、故障现象 一辆2017款长安福特翼虎车,搭载CAF488WQ9发动机,累计行驶里程约为8.9万km。该车因发动机故障灯异常点亮在其他维修厂检修,维修人员用故障检测仪检测,提示气缸3失火,调换火花塞、点火线圈及喷油器&#xf…

Sandcastle生成文档

下载: https://github.com/EWSoftware/SHFB/releases 使用Sandcastle生成Api文档需要使用对应程序集的注释xml 程序集dll作为数据源,通过对xml dll数据解析生成文档;所以主体步骤如下: 程序集资源生成创建配置.shfbproj项目编译构建文档 …

累计概率分布、概率分布函数(概率质量函数、概率密度函数)、度量空间、负采样(Negative Sampling)

这里写自定义目录标题 机器学习的基础知识累计概率分布概率分布函数度量空间负采样(Negative Sampling)基于分布的负采样(Distribution-based Negative Sampling):基于近邻的负采样(Neighbor-based Negativ…