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

汽车电子与软件 2023-10-27 21:04

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


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


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



01

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



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


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


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


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


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


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


争论一直存在。


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



02

单元测试的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的模块。



03

单元测试意义的思考



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


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


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


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



04

全文小结



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


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


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


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




05

写在最后



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


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




汽车电子与软件 主要介绍汽车电子软件设计相关内容,每天分享一篇技术文章!
评论
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 135浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 324浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 666浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 181浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 619浏览
  • 故障现象 一辆2007款日产天籁车,搭载VQ23发动机(气缸编号如图1所示,点火顺序为1-2-3-4-5-6),累计行驶里程约为21万km。车主反映,该车起步加速时偶尔抖动,且行驶中加速无力。 图1 VQ23发动机的气缸编号 故障诊断接车后试车,发动机怠速运转平稳,但只要换挡起步,稍微踩下一点加速踏板,就能感觉到车身明显抖动。用故障检测仪检测,发动机控制模块(ECM)无故障代码存储,且无失火数据流。用虹科Pico汽车示波器测量气缸1点火信号(COP点火信号)和曲轴位置传感器信
    虹科Pico汽车示波器 2025-01-23 10:46 80浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 145浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 159浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 123浏览
  • 飞凌嵌入式基于瑞芯微RK3562系列处理器打造的FET3562J-C全国产核心板,是一款专为工业自动化及消费类电子设备设计的产品,凭借其强大的功能和灵活性,自上市以来得到了各行业客户的广泛关注。本文将详细介绍如何启动并测试RK3562J处理器的MCU,通过实际操作步骤,帮助各位工程师朋友更好地了解这款芯片。1、RK3562J处理器概述RK3562J处理器采用了4*Cortex-A53@1.8GHz+Cortex-M0@200MHz架构。其中,4个Cortex-A53核心作为主要核心,负责处理复杂
    飞凌嵌入式 2025-01-24 11:21 50浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 195浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦