0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_EksNQtU6 来源:谈思实验室 2023-10-22 14:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

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

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

写在最后

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 汽车行业
    +关注

    关注

    0

    文章

    366

    浏览量

    16532
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • 汽车软件
    +关注

    关注

    1

    文章

    151

    浏览量

    3665

原文标题:汽车软件单元测试的要点与意义

文章出处:【微信号:谈思实验室,微信公众号:谈思实验室】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入软件单元测试的全面研究与实践

    引言 嵌入软件单元测试是确保嵌入式系统质量和可靠性的关键环节。嵌入式系统广泛应用于汽车电子、工业控制、医疗设备等关键领域,其软件直接操控硬件,任何微小的错误都可能导致严重后果。
    的头像 发表于 12-01 14:31 179次阅读

    新能源汽车质量保证体系与传统汽车单元测试规范的融合研究

    摘要 随着新能源汽车产业的快速发展,其质量保证体系面临前所未有的挑战。本文探讨了将传统汽车成熟的单元测试规范应用于新能源汽车领域的可行性,重点分析了ISO 26262标准体系在新能源
    的头像 发表于 11-07 10:10 92次阅读

    单元测试专业工具在新能源开发中的作用研究

    单元测试的历史由来与发展 单元测试的概念可以追溯到20世纪60年代,伴随着计算机科学和软件工程学科的发展而逐步形成。早期的计算机科学研究(20世纪60年代)中,程序员意识到仅依靠手工调试和集成
    的头像 发表于 11-03 16:03 308次阅读

    嵌入式软件测试与专业测试工具的必要性深度解析

    ‌:单元测试、集成测试、系统测试等不同阶段可能需要不同的工具组合16。 ‌软件特性‌:实时性要求、安全等级等特性决定工具的功能需求。 ‌环境适配性‌:工具是否支持目标硬件平台和开发
    发表于 09-28 17:42

    边聊安全 | 软件单元测试的设计方法

    上海磐时PANSHI“磐时,做汽车企业的安全智库”软件单元测试的设计方法写在前面:软件单元测试的设计是一个系统化的过程,旨在验证代码的最小可
    的头像 发表于 09-05 16:18 4336次阅读
    边聊安全 | <b class='flag-5'>软件</b><b class='flag-5'>单元测试</b>的设计方法

    汽车软件安全测试中的痛点与Bugspot解决方案

    上海磐时PANSHI“磐时,做汽车企业的安全智库”汽车软件安全测试中的痛点与Bugspot解决方案日前在汽车行业,
    的头像 发表于 09-05 16:17 434次阅读
    <b class='flag-5'>汽车</b><b class='flag-5'>软件</b>安全<b class='flag-5'>测试</b>中的痛点与Bugspot解决方案

    汽车软件开发阶段安全的意义与原则

    上海磐时PANSHI“磐时,做汽车企业的安全智库”好书分享/《一本书读懂智能汽车安全》汽车软件开发阶段安全的意义与原则本文节选自SASETE
    的头像 发表于 09-05 16:16 673次阅读
    <b class='flag-5'>汽车</b><b class='flag-5'>软件</b>开发阶段安全的<b class='flag-5'>意义</b>与原则

    HarmonyOSAI编程单元测试用例

    根据选中的ArkTS方法名称,CodeGenie支持自动生成对应单元测试用例,提升测试覆盖率。 在ArkTS文档中,光标放置于方法名称上或框选完整的待测试方法代码块,右键选择CodeGenie
    发表于 08-27 14:33

    单元测试工具TESSY现已支持ABIX HiperSIM,助力MELEXIS MLX16 汽车嵌入式系统的软件验证

    TESSY现已支持ABIX HiperSIM,为基于MELEXIS MLX16架构的汽车嵌入式系统提供高效、可靠的软件验证解决方案。自动化测试+高保真仿真,助力提升软件质量与开发效率。
    的头像 发表于 07-17 13:39 670次阅读
    <b class='flag-5'>单元测试</b>工具TESSY现已支持ABIX HiperSIM,助力MELEXIS MLX16 <b class='flag-5'>汽车</b>嵌入式系统的<b class='flag-5'>软件</b>验证

    HarmonyOS AI辅助编程工具(CodeGenie)代码测试

    本功能从DevEco Studio 5.1.0 Release版本开始支持。 根据选中的ArkTS方法名称,CodeGenie支持自动生成对应单元测试用例,提升测试覆盖率。 在ArkTS文档中,光标
    发表于 07-14 17:33

    新能源车软件单元测试深度解析:自动驾驶系统视角

    ‌第一部分:新能源车软件单元测试的战略重要性 ‌汽车电子架构的范式转变‌ 随着新能源车的普及,汽车电子架构从传统的分布式ECU(电子控制单元
    发表于 05-12 15:59

    新能源车背后的隐形守护者:软件单元测试的生死较量‌

    。这个教科书级的避让动作背后,是超过8000万行代码的精密协作,而确保这些代码绝对可靠的秘密武器,正是我们今天要揭秘的软件单元测试。 ‌一、代码世界的显微镜:单元测试为何重要‌ 如果把整车软件
    的头像 发表于 05-12 11:00 438次阅读

    单元测试在嵌入式软件中的关键作用及winAMS工具的卓越贡献

    1. 单元测试概述 ‌定义与核心目标‌ 单元测试软件开发过程中针对程序模块(如函数、类或组件)的最小可测试单元进行的验证活动。其核心目标在
    的头像 发表于 04-11 14:31 755次阅读

    嵌入式软件单元测试的必要性、核心方法及工具深度解析

    一、为什么嵌入式软件必须重视单元测试? ‌嵌入式系统的特殊性‌ 在汽车 ECU、医疗设备控制器等场景中,软件直接操控硬件,‌单比特错误可能导致刹车失灵或呼吸机故障‌。不同于 PC 
    的头像 发表于 03-21 14:53 960次阅读

    嵌入式系统开发中的测试方法 嵌入式系统开发与AI结合应用

    嵌入式系统开发中的测试方法 嵌入式系统开发是一个复杂的过程,涉及到硬件和软件的紧密结合。测试是确保系统可靠性和性能的关键步骤。以下是一些常用的测试方法:
    的头像 发表于 12-09 10:22 2046次阅读