摘要:应用全对测试方法,对汽车软件的测试用例开发进行研究,以保证测试覆盖度和提高测试效率为目标,开发自动化工具并加以应用。文章以使用语音助手播放音乐为例,先分析用户的使用场景和使用习惯,识别出可能的因子和水平;再使用自动化工具生成典型测试用例,并定义每个测试用例的期望表现;接下来进行测试,通过比较实际表现和期望表现,得到每个用例的测试结果;最后根据测试结果计算每两个因子的各水平组合的失效率,得到响应表;如果响应表中发现缺陷,则优化软件再次开展测试,直到响应表中没有缺陷,也就是软件在测试中没有任何问题为止。通过该实例的详细阐述,说明全对测试方法在汽车软件测试中的作用和价值,已成为提升测试覆盖率和效率的重要助力。
近年来,汽车行业经历着前所未有的变革,市场竞争日益加剧,整车开发验证周期不断缩短。智能化、网联化、电动化的发展趋势导致汽车软件功能的复杂性指数级上升,现在一辆汽车的软件代码已高达几千万行甚至上亿行,再叠加用户多样化的使用场景和体验需求,使得汽车软件功能的全面有效测试变得越来越具有挑战性。
为了保证汽车软件的安全性、可靠性和正常工作,当前行业内综合应用多种多样的测试方法,可以从如下维度进行分类:按照开发过程的阶段,可以分为单元测试、集成测试、系统测试和整车验收测试等;按照内部结构和具体实现的方式,可以分为黑盒测试、白盒测试、灰盒测试等;按照测试技术,可以分为冒烟测试、回归测试、随机测试、迭代测试、压力测试等[1-2]。
然而,尽管有这些测试方法的存在,汽车软件测试仍然面临着多方面的挑战。首先,汽车软件的规模、关键性和复杂性都在增加,功能之间往往需要互相协同和逻辑仲裁,导致系统失败的风险增高,必须对软件进行更有效的测试以发现尽可能多的缺陷;其次,用户多样化的使用场景意味着不同的操作方式和环境条件,每种场景都对车辆的性能和软件的稳定性提出了不同的要求,因此软件测试需要覆盖尽可能多的测试用例,以确保软件在各种用户场景下都能正常工作;最后,汽车开发验证周期越来越短,对软件测试的效率提出了更高要求,在保证软件质量的同时,也需要考虑到测试用例的设计和执行的成本和时间。
面对上述的挑战,为了提高汽车软件测试的有效率、覆盖率和效率,本文提出一种基于全对测试的测试用例开发方法,通过系统化的用例设计来模拟各种操作场景并识别潜在的缺陷。这种方法能够在软件的功能和逻辑测试中,提高测试覆盖率,优化资源分配,增强验证过程的系统性和科学性。
软件系统的故障常常是由一些难以预料的异常交互引起的,一般把那些可能影响软件表现的变量称为因子(factor)。这些因子可以是自然环境类,如温度、光照、海拔等,可以是人工环境类,如路况、交通标识、行人、附近车辆等,可以是车辆状态类,如挡位、速度、负载等,可以是人员操作类,如踩踏板、操作按键、操作中控屏、下发语音指令等,也可以是相关系统和软件的状态切换等。每个因子在不同的场景下可能是不同的取值(定性或定量),这些取值称为因子的水平(level)。正是这些因子和水平的全排列组合,构成了该软件测试用例覆盖的整个空间。
假设某软件功能系统有n 个因子,每个因子分别有v1、v2、v3、…、vn 个可能的取值,如果想把所有可能的用例都测试到,即采用全因子排列,需要的测试用例数量是:v1×v2×v3×…×vn,通常情况下这是一个很庞大的数字。显然,受到时间、费用等资源的限制,采取全因子排列进行测试是不切实际的,需要更先进的测试技术来提高测试性价比。研究发现,大约20%~40%左右的软件故障是由某个因子引发的,20%~40%左右的故障由某两个因子的相互作用引发的,合计大约73%的软件故障是由一个或两个因子的相互作用引起[3],因此全对测试是一种比较好的测试方法,可以平衡用例数量和用例覆盖率。
全对测试(Pairwise Testing/ll-Pairs Testing),也叫两两测试或配对测试,它的基本原则是每个因子的每一个取值都必须与任意其他因子的每一个取值至少配对过一次,以保证每个因子的各个水平都能被测试到,任意两个因子的各个水平的组合也都能被测试到。但产生最小配对测试集是一个NPC(Non-deterministic Polynomial Complete)问题,也就是说不可能存在某一算法一定可以产生最小测试集。各研究者提出了不同的算法,目的都是为了产生接近最优的测试集,例如正交拉丁方(Orthogonal Latin Square)算法[4]、AETG(Automatic Efficient Tests Generator)算法[5]、IPO(In-Parameter-Order)算法[6]、模拟退火(Simulated Annealing)算法[7]等。
其中正交拉丁方算法使用最广泛,它是一种特殊的组合设计,由两个或多个拉丁方组成,这些拉丁方的相同行和列中没有重复的元素组合,并确保每种可能的行列组合都至少出现一次。如果每个因子的每个水平与其他因子的每个水平均匀地组合,那么就构成了正交列表(Orthogonal Arrays),它是正交拉丁算法的一种特殊应用,不仅考虑了行和列的正交性,还考虑了更高维度的交互作用。
当前正交拉丁算法已经在整车开发的性能优化中得到大量应用,如汽车发动机噪声源识别与分析[8]、五连杆悬架运动学特性分析[9]、纯电动车多学科轻量化设计[10]、行李箱盖内板冲压成形工艺优化[11]等。虽然在汽车软件功能测试中的应用还不常见,但该算法的广泛应用为工程师们将其应用在测试用例开发中打下了坚实的基础。正交拉丁方算法的优势在于构造简单,数学模型清晰,在已知因子个数以及每个因子的取值数量时,可以准确计算出测试用例的数量;不足之处是正交拉丁方算法得到的测试集并不一定是最小的。经研究,虽然正交拉丁方算法并不是产生所有全对测试集的最完美方案,但对大部分汽车软件而言,它已经能够大大降低测试用例数量,有效降低软件测试时间,提高软件迭代的效率,具有很强的实用性,所以本文采用正交拉丁方算法来产生汽车软件系统全对测试的测试用例集。
在某整车项目的软件系统验收测试中,使用全对测试方法来开发软件测试用例,确保能提供足够的测试覆盖率,帮助发现软件中的缺陷并迭代改进,具体流程如图1 所示。
图1 汽车软件全对测试流程
接下来具体介绍流程中各步骤的主要内容和工作要点。
测试用例的开发需要集团队之力,确保不会遗漏软件系统的重要输入,因此流程的第一步就是组建专家团队。团队中需要包含上下游的需求方、软件开发方、测试执行方、协调方以及其他利益相关方,通过团队的协作讨论,对软件系统开展全面系统的分析。
定义因子和水平是全对测试的关键,团队需要从用户的实际使用场景和操作习惯出发,识别出软件系统中所有可能的导致软件不同表现的因子,才能全面地开展测试。可以从如下维度去思考可能的因子及水平:1)软件系统需求、子系统规范;2)软件系统功能框图,包括子系统和信号;3)状态机图及时序;4)历史失效、潜在失效模式;5)对用户使用条件的理解;6)相关专家的经验等。
从测试执行的角度,这些因子可以分成两大类,构建初始测试条件的因子,以及模拟用户操作和事件的因子,它们共同构成测试框架。同时,在识别因子和水平时,不但要考虑用户按照软件功能意图去操作的场景,也要考虑到用户可能的误用滥用情况,以保证测试用例的全面性[12]。
基于正交拉丁方算法,本文使用Visual Basic语言,构造了一个全对测试用例自动化生成的自动化工具,方便快捷地开展测试。为了最大化地利用正交列表,这个工具希望变量取值比较均匀,只研究水平取值数是2n 的因子组合,水平数不满足的因子可以使用替代处理。图2 是该自动化工具的因子填写界面,工具会自动校验每个因子的取值数是否符合要求,校验通过后,点击上侧的“Create Use Cases”按钮,即可自动选择合适的正交列表,生成测试用例。
图2 因子和水平填写界面
接下来需要团队一起讨论,基于软件的需求、功能定义和逻辑设定,在这每一个测试用例条件下,该软件系统的期望表现是什么样?将这些期望表现作为判断软件是否有缺陷的标准依据,建立起完整的测试包。
测试包就绪后即可开展测试并收集数据,测试的形式可以有很多种,比如软件在环(Software In the Loop, SIL)、硬件在环(Hardware In the Loop,HIL)、台架测试、模拟测试、整车测试等。对比软件的实际表现与期望表现,两者一致的记为0,不一致的记为1,表示存在问题。
通过比较每个因子各水平与其它每个因子各水平的组合用例的测试结果,可以计算出任意两个因子各水平的组合的失效率,创建响应表。因子X 和因子Y 的各水平组合的失效率计算方式如下:
以4 个因子,每个因子各有4 水平为例,可生成响应表如图3 所示,它清楚地展示每两个因子的各水平组合的失效率。
图3 全对测试响应表
对于响应表中失效率为1,也就是100%失效的因子水平组合需要特别关注,可以作为复现问题的可靠途径,从而找到软件缺陷的根本原因以改进软件。软件更新后,可以再次利用全对测试用例和期望响应,对新软件重复开展测试,以确保识别到的问题得到解决,并且不会产生其他新问题。这个过程可以迭代开展多次,直到响应表中只有0,也就是没有发现任何问题,这样就完成了该汽车软件的全对测试和迭代优化过程。
语音助手是智能座舱中的基础功能,也是用户最常使用的功能之一,直接影响用户的体验,接下来本文应用全对测试方法,对使用语音助手播放音乐这个功能开展测试。
组建了跨领域团队之后,一起讨论用户在各种使用场景下的可能因子和水平,共识别到10 个因子,其中3 个因子2 水平,2 个因子4 水平,5个因子8 水平,如表1 和表2 所示。其中G 因子为了满足水平数是2n 个,做了替代处理,即G7和G8 是同样的物理含义。
表1 初始条件因子和水平表
表2 事件因子和水平表
对这些因子和水平,如果采用全因子排列以覆盖所有的使用场景,需要的测试用例数是n=23×42×85=4 194 304,就算每个测试用例只需要几分钟,那么全部完成测试也是个不可能完成的任务。使用全对测试,可以将测试用例数量精简到64 个,而且能够测试到每两个因子各水平的组合情况,在保证覆盖度的情况下,压缩效率为99.998%。
在自动化工具生成64 个测试用例的基础上,根据语音助手播放音乐的功能定义和逻辑设定,确定了每个测试用例在每次唤醒时的期望响应,包括语音反馈、屏幕显示、音乐内容、音频来源和音量。
接下来在整车上开展测试,记录实际响应与期望响应是否一致,一致记为0,不一致记为1,如表3 所示。
表3 全对测试测试结果
根据测试结果,可以计算每两个因子的各水平组合的失效率,也就是响应表,图4 展示了响应表的部分结果。
图4 语音助手播放音乐响应表部分结果
根据响应表的结果,找到问题发生的原因,改进软件后再次开展全对测试,确保识别到的问题全部得到了解决。
在使用语音助手播放音乐的软件测试中,每个测试用例需要测试5 分钟,总共只需要5 个多小时即可完成一轮测试,全部覆盖了每两个因子的各水平组合,也大幅提高测试效率,便于快速进行软件的多次迭代和优化。
综上所述,全对测试方法十分符合汽车软件系统测试的特点和需要,可以应对当前面临的挑战。利用全对测试方法能够贴合用户的实际使用场景,保证软件功能测试的覆盖率,还能够大大降低软件测试的资源需求,如果再结合自动化测试工具的方法,可以进一步提高测试效率。
另外,在开发前期,通过全对测试识别的用例还能作为开发的输入,将软件的需求梳理得更完整清晰,进而可以与行为驱动开发的思想结合,解决需求和开发脱节、开发与测试脱节的问题,从用户的需求出发,保证软件实现效果与用户需求一致。
需要指出的是,汽车软件测试的范畴很广,全对测试对于功能和逻辑的测试很有效,但不能代替其他诸如性能测试、安全性测试、压力测试、偶发故障测试、耐久性测试等。这些聚焦在不同维度的测试方法需要相互集成配合,在汽车软件系统测试中共同发挥作用,提高汽车软件的安全性和可靠性。
参考文献
[1] JORGENSEN P C.软件测试:一个软件工艺师的方法(原书第4 版)[M].马琳,李海峰,译.北京:机械工业出版社,2020.
[2] 林莉莉,魏敏.汽车嵌入式软件质量管理技术研究[J].汽车与新动力,2023,6(1):59-61.
[3] 严俊,张健.组合测试:原理与方法[J].软件学报,2009,20(6):1393-1405.
[4] 任洛漪.正交实验设计法在组合测试的应用[J].电脑知识与技术,2022,18(5):68-69.
[5] KAMPEL L,LEITHNER M,SIMOS D E.Sliced AETG:A Memory-Efficient Variant of the AETG Covering Array Generation Algorithm[J].Optimization Letters,2020,14(6):1543-1556.
[6] 周进,刘杰,肖安洪,等.基于DCS 系统组件的变力度组合测试方法[J].计算机工程,2021,47(9):178-183.
[7] 刘俊杰.基于模拟退火粒子群算法的类集成测试序列生成方法研究[D].徐州:中国矿业大学,2023.
[8] BALLESTEROS J A,FERNANDEZ M D,SARRADJ E.Identification and Analysis of the Noise Sources of an Engine Settled in a Car Using Array-based Techniques[J].International Journal of Vehicle Noise and Vibration,2018,14(2):171-190.
[9] 李根,代迪.五连杆悬架运动学特性DOE 分析研究[J].汽车工程师,2024(1):55-61.
[10] 蒋青青,吴锦妍,龙宜凡.基于混合试验设计的纯电动车多学科轻量化设计[J].上海汽车,2023(9):21-26.
[11] 王康康,陈泽中,江楠森,等.基于GA-BP 的汽车行李箱盖内板冲压成形工艺优化[J].塑性工程学报,2023(3):197-203.
[12] 赵永青.基于行为驱动开发的改进X 测试模型及其应用[J].软件,2021,42(9):148-150.