• 555查看
  • 0回复

[应用层软件] 怎么理解SWE.4 软件单元测试 Part1

[复制链接]


该用户从未签到

发表于 30-5-2024 22:19:54 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


1 什么是软件单元   

软件单元测试是针对软件设计的最小可测单元进行测试,这里软件单元的精确定义是怎样的?这将对软件单元测试至关重要。在《GB/T15532 计算机软件测试规范》中软件单元测试的“单元”定义为“可独立编译或汇编的程序模块”。而在汽车ECU软件,软件单元可以认为是承担了一个单一职责的功能模块,也可以认为是国标所定义的那样。更具体来讲的话,可以借助AutoSAR架构的软件分层定义来理解,我们知道AutoSAR架构将软件分层为可运行实体(Runnable entity),原子软件组件(Atomic SWC)和软件组件的组合(Composition SWC)。与C语言手写软件的对应关系如下所示:
怎么理解SWE.4 软件单元测试 Part1w1.jpg
这里只以AutoSAR架构的软件分层概念来说明,软件单元作为软件架构中的最小实体,可以是可运行实体,也可以是原子软件组件,具体取决于它们的复杂程度。

怎么理解SWE.4 软件单元测试 Part1w2.jpg
Source: 用 Simulink 开发符合 ISO26262 和 AUTOSAR 的应用软件 (qq.com)如果一个原子软件组件功能简单,只包含一个或几个运行实体,将这个应用软件组件本身定义一个软件单元,既可以满足测试的指标要求,也可以节省很多开发和测试的时间。   如果一个原子软件组件包含多个运行实体而且功能较复杂,那么还将其定义为软件单元,可能导致达不到测试的指标要求,此时将运行实体定义为软件单元才更合理,有时可能某些运行实体的功能也非常复杂,这时候可能会进一步将一个运行实体划分为几个软件单元来实现。不管怎么样,对于软件单元的定义并不是一个固定不变的概念,应该以测试的指标要求为前提,再具体问题具体分析,这是因为工程项目的关键要素有:质量,成本和时间,需要综合考虑这三个要素。因此,软件单元测试的指标要求是需要综合考虑测试的投入与收益,原则当然是尽可能最少时间,资源和人力的投入,获取更好的软件质量。通常在不同的企业或不同的项目,软件单元测试指标定义都可能有所差异。再对软件单元的定义有了清晰的认识之后,那么就可以开始来了解软件单元测试(验证):2 什么是软件单元测试  

汽车ECU的软件单元测试通常分为静态单元测试和动态单元测试。

2.1 静态单元测试

静态单元测试是指使用静态验证(可在不实际执行程序的情况下获取程序的动态属性)来证明没有运行时错误,包括:

    数据流检查:检查变量读取、函数返回值和条件语句。比如正在读取的变量是否已初始化,条件语句的分支是否可达,在运行时是否调用某个函数。

    数值检查:检查算术运算中是否有运行时错误,比如溢出或除以零。

    静态内存检查:检查与静态分配内存相关的运行时错误,例如,超出边界的数组访问或指针解引用。

    控制流检查:函数调用和循环检查,比如无限调用和无线循环。

    其他检查:标准库函数使用、指针转换和 assert 语句的检查。

以及检查代码是否符合编码规则标准,比如 MISRA C、CERT C和自定义命名规范等;识别缺陷,比如是否存在安全漏洞、并发性和数值的缺陷等。

静态单元测试的执行通过测试工具对代码进行静态分析,常用的工具有Polyspace,Tessy,QAC等,以Polyspace静态代码分析为例,运行结果如下所示:

怎么理解SWE.4 软件单元测试 Part1w3.jpg

Source: PolyspaceCode Prover 产品信息
每个代码语句都进行了着色,以指示它是否存在运行时错误、是否已证明失败、是否不可达或是否未经证明,使用红色、绿色,灰色或橙色表示,具体颜色的含义如下:
怎么理解SWE.4 软件单元测试 Part1w4.jpg
Source: Polyspace Code Prover 产品信息我曾经参与的项目至少是不允许红色的出现,必须修复。再以QAC静态代码分析为例,所有9 级错误(error)均属于 QAC 的配置问题或本身语法错误,因此该级别错误不可忽略,也是必须得修复。
怎么理解SWE.4 软件单元测试 Part1w5.jpg
source: 【回眸】QAC软件指南——萌新使用篇_helix qac
以上就是静态单元测试的具体执行情况,即通过使用有效的测试工具进行静态代码分析,可识别、修复或挖掘潜在的运行时错误,并检查源代码是否遵循MISRA C,具体操作取决于选用哪一个工具。
2.2 动态单元测试动态单元测试是软件单元测试的重点,简单地说,首先动态单元测试最基本的目的就是验证功能是否实现了相对应的软件需求。其次为了更好地预判软件运行结果,会考虑测试指标要求,比如选用哪种覆盖度类型以及覆盖率要求多少--选用分支覆盖率,并要求达到100%覆盖。最后是以怎样环境形式进行单元测试,是MIL?是SIL?还是PIL。
怎么理解SWE.4 软件单元测试 Part1w6.jpg

Source: Software for consistent and effective automation of automotivetest environment
在这些测试内容已确定的情况,接下来就是考虑具体如何来实施。首先是构建单元测试的框架,包括测试用例和测试结果的导入,测试用例的管理,以及测试结果的分析与评估等。然后是测试用例的设计和测试结果的预期,可以已构建的测试框架中进行设计,也可以使用外部工具(比如Excel)进行设计,将其导入测试框架。最后是测试运行设置、结果分析及其生成测试报告,比如在某个测试用例下修改某些标定量或常量的数值,设置测试用例运行的迭代次数,分析测试数据与测试结果;分析覆盖度指标的达成情况和未覆盖的原因等。

怎么理解SWE.4 软件单元测试 Part1w7.jpg

怎么理解SWE.4 软件单元测试 Part1w8.jpg

在上述的这些步骤中,如何构建一个通用性的单元测试框架对一个软件开发项目非常关键,决定了测试的效率和统一。如何设计测试用例也是单元测试的关键点,需要对已有软件逻辑和测试指标有深刻的理解,才能更有效率。另外,软件单元测试的管理也十分重要,因为软件通常处于不断开发或变更的状态,持续管理好测试通常都需要有强大的测试软件或工具支持。

3 小结

以上就对软件单元,静态单元测试和动态单元测试的概念和执行做了大致的介绍,理解它们对软件单元测试非常重要。为了更好地落地动态单元测试,下篇文章将结合功能安全标准GB/T 34590.6 2017进一步介绍软件单元测试,欢迎点赞关注收藏。

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 26-12-2024 21:04 , Processed in 0.214602 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.