基于SOA自动化测试框架及其应用
基于Perl的嵌入式软件自动测试框架及其应用
陈全员
(蔚来软件科技(上海)有限公司,上海 201102)
摘要:嵌入式软件的自动化测试由于其自身的特性,相对于其他软件的自动化测试更加困难。分析嵌入式软件测试困难,并寻求解决方案,再此基础上提出基于Perl的嵌入式软件自动化测试框架。依据该测试框架,建立“基于Perl脚本的OpenMax软件自动测试系统”,有效提高了测试效率,很好的支持了公司内部OpenMax项目的开发以及相应客户,保证了软件的顺利交付。
关键词:SOA;自动化测试;Python;OpenMAX
根据博世对未来电子电气架构发展趋势预测,电子电气架构从最早的分布式架构逐步向集中式演进方向。发展到现在,汽车发展呈现两个趋势,一个是网联化,另一个是智能化。从技术演进的角度来讲,汽车智能化的过程就是从最早传统CAN/LIN 网络、到车载以太网,最后从架构开始升级。在软件定义汽车的概念下,汽车软件架构逐步向SOA的架构迈进,而SOA架构可以把车和云端口服务暴露出来,做各种开发,进而衍生出测试的需求。
随着汽车新四化的推进,汽车整车厂在实现车辆网联、自动驾驶和数据驱动的同时,更要在满足用户体验和基本服务的基础上快速响应客户的个性化需求,为更好地解决这些新的挑战,整车厂引入了高性能的芯片、突破性的技术产品,同时传统的EE架构也需要变革,SOA(面向服务的架构)成为大多整车厂响应市场需求的首选架构。SOA架构的主要优势是可以在很大程度上实现分布式系统软件模块间的解耦,通过软件升级OTA可以更方便灵活地将服务实体部署在任意的域控制器上,服务之间只需通过简单、精确定义的接口进行通讯,不涉及底层编程接口和通讯模型。而且对于ECU的版本更新、信号库更新、代码修改等过程更加简便和灵活。简化了注册服务与调用API,节约了时间成本,提高系统的健壮性和可扩展性。
基于嵌入式系统设计的软件称为嵌入式软件。随着嵌入式系统的广泛应用,嵌入式软件的重要性也越来越突出。在各种实际应用领域中,嵌入式软件质量往往关系到人民生命财产和生态环境的安危。一旦软件发生故障,就可能造成人的生命和财产的巨大损失或生态环境的破坏[1]。通过测试集对软件进行测试是保证软件质量的重要手段,在软件生存期中占有非常重要位置。根据Boehm的统计,软件开发总成本中,用在测试上的开销要占30%到50%[2]。
对嵌入式软件测试的研究由来已久[3~4],不仅要测试系统软件,而且也要考虑相关的硬件组件,实时性需求以及性能相关的特性等。因此对于嵌入式软件的测试,将更加复杂,尤其是实施测试自动化技术困难[4]。基于Perl的嵌入式软件自动化测试框架,提供了一种实现嵌入式软件自动测试的方法,能够有效提高测试效率。
嵌入式软件与其他软件相比,具有专用性,它只能在需求所指定的硬件平台上执行,并且嵌入式软件的开发环境和运行环境是不一致的,因此即使宿主机环境下测试再充分,也不能说明在目标机环境下运行该软件就不出问题。因而,嵌入式软件还面临着目标环境的测试。这不仅增加了测试的代价,而且还带来了嵌入式软件的测试策略问题,即哪些测试分配在宿主环境进行,哪些测试分配到目标环境下进行[5]。
1.1. 嵌入式软件测试与普通软件测试的相同之处
传统的软件测试是将软件分在不同的层面上进行测试,包括模块测试(或单元测试),集成测试,系统测试等。嵌入式软件测试和一般的软件测试存在着许多相似的问题和相似的解决方法。这就是嵌入式软件的通用的测试方法。
· 按阶段可分为单元测试、集成测试、系统测试和确认测试。
· 根据测试时是否运行被测试的程序,软件测试技术还可分为静态测试方法和动态测试方法。
· 从测试是否针对系统的内部结构和逻辑处理过程,通常可分为:白盒测试与黑盒测试。
1.2. 嵌入式软件的独特之处
嵌入式系统由于自己本身的特点,如实时性强、内存不丰富、I/O通道少、开发工具昂贵并且与硬件紧密相关、CPU种类繁多等等,决定了不同的嵌入式系统必须有不同的测试方法,下面介绍几种不同的嵌入式产品在测试时应特别关注的问题。
·唯一系统——“一次性”开发:某些系统,比如人造卫星,一旦发射之后就无法对其进行维护。对于这种系统,需要多考虑维护、复用和回归测试等因素。
·自治系统:有些嵌入式系统可以在无限长的时间内自主运行,它们担负某种任务。一旦运行后,就不再需要有人干预或与人交互。因此就需要特殊的测试环境和测试工具来执行测试用例,并测量和分析结果。
·硬件限制:硬件资源的局限性会给嵌入式软件带来一定的约束,比如内存使用和电力消耗。
·硬实时行为:“实时”的本质就是输入或输出在发生的瞬间就能够影响到系统的行为。
·控制系统:控制系统通过连续的反馈机制和环境相互作用:系统的输出会影响环境,而环境反过来会影响到控制的行为。
·强调安全系统:在嵌入式系统中当嵌入式系统的故障会导致对人体健康的严重伤害(或更为可怕的后果)时,则称该系统是“强调安全”的。
·极端的环境条件:有些系统需要在极端的环境条件下进行连续的操作,比如极热或极冷、机械震动、化学物质或放射性等环境条件。测试这些系统需要有特殊的设备来提供极端条件。
从表面看来,嵌入式系统的行为通常简单又明了。但实现这样的系统仍然是非常困难的一件事情,可能需要大量的控制软件来处理复杂的科学运算。针对以上对嵌入式系统的独有特点的分析,可以看出嵌入式软件的充分测试就显得更有必要。
2. 基于Perl的嵌入式软件自动测试框架
2.1. 嵌入式软件测试的难点
嵌入式软件测试环境可以模仿交叉开发环境来搭建。因为前期的一些测试包括单元测试、集成测试都可以在宿主机上完成,所以前期的测试环境与主机开发环境类似。后期的一些测试,包括硬软件集成测试、系统测试等则需要构建交叉测试环境来完成。
构建交叉测试环境要解决的主要问题包括[6]:
· 宿主机和目标机之间的通信连接;
· 目标机如何反馈调试信息及调试信息在宿主机端的显示;
· 宿主机如何对目标机程序进行测试交互;
· 如何处理异常实现完全自动化;
· 如何使自动测试系统不增加目标机的负荷。
为此提出基于Perl的嵌入式软件测试框架,其框图如下图1所示:
图1 基于Perl的嵌入式软件自动测试框架
2.2. 宿主机和目标机之间的通信
在当今的嵌入式软件开发和测试过程中,宿主机和目标机之间的物理连接,可以是通过串口,采用串口通信方式;也可以是以太网口,一般基于TCP/IP 协议传输,也可以基于Telnet进行传输;还可以通过USB进行数据传输,其速度更快,尤其用于烧录文件系统,效果更好。在实际应用中,可以根据需要,混合使用多种传输方式,比如烧录文件系统,使用USB传输,在线调试使用串口通信。
由于实际的嵌入式系统在开发和测试过程中,实时交互频繁,采用基本的串口通信仍然是最常用的方法。为此,该自动测试系统,使用Perl提供的强大的串口模块—SerialPort,实现宿主机和目标机之间的通信。
2.3.目标机如何反馈调试信息及调试信息在宿主机端的显示
目标机被测试模块在获取输入后,进行相应处理,产生正常响应信息或抛出异常、错误信息。这些信息的反馈受目标机资源限制(如没有视频显示)或者不便于通过目标机输出(如目标机的显示屏正在用于视频输出),一般都是通过宿主机和目标机之间的通信(比如通过串口),反馈给宿主机处理。这样宿主机可以根据目标机反馈的信息判断测试用例是否通过,并决定是否继续发送下一条测试命令。
2.4.宿主机与目标机程序进行测试交互
宿主机对目标机程序进行的测试控制,实际上主要是从宿主机输入测试用例,捕获目标机上被测试模块是否正常接受测试用例,并依据目标机的反馈信息,判断测试结果,进行相应的操作。
2.5.异常处理及完全自动化
嵌入式软件自动化测试的另外一个难题是,当目标机遇到异常,处于悬挂或死机状态时,自动测试系统将被终止,失去连续测试的能力。为了解决这个问题,在自动测试系统中,引入可控电源对目标机供电。可控电源是一种可以根据用户需要,用程序控制其启动或关闭的电源。
在自动测试系统中,宿主机通过串口,定期(如每隔2秒)检测目标机的状态,或者依据目标机从串口反馈的信息,一旦确定目标机处于悬挂或者死机状态,则通过Perl脚本,远程控制可控电源(关断电源片刻,然后重启电源),从而使目标机重新启动,恢复被测试环境。使用该方法,跳过导致目标机悬挂或死机的测试用例(当然判定该测试用例失败,并手动验证),继续执行下一个测试用例,实现自动测试的连续性。
2.6.自动测试系统不应增加目标机的负荷
众所周知,嵌入式系统的处理器相对于PC机的处理器,其CPU的主频低、内存容量小,因此,即使当今的嵌入式系统的处理器已经有了飞速发展,其数据处理能力仍低于高端PC机的处理器。一些工程师喜欢将自动测试系统嵌入到目标机,在目标机上运行并处理运行结果。这样虽然方法简单明了,但是会因此增加目标机CPU的负荷,占用目标机的内存,从而影响测试的准确性。
那么如何减少自动测试系统对目标机的影响,减少由于测试系统而引入的测试偏差呢?总的原则是:让自动测试系统尽可能少的增加目标机的负荷。为此,将能够在宿主机上完成的任务尽量在宿主机上完成。该“基于Perl的嵌入式软件自动测试框架”,在宿主机上完成的任务有:
· 设计测试用例,将测试用例分解为便于通过串口向目标机发生的脚本或者命令集合;
· 建立基于Perl的串口环境,比如设置串口选项等;
· 撰写测试脚本,为自动测试做准备;
· 发送测试用例命令:依据测试需求及相应的测试用例,通过串口向目标机发生测试指令;
· 分析测试结果:捕获从串口输出的测试用例的执行结果信息,依据Perl提供的强大的文字处理能力,分析测试是否通过,并在测试结束后汇总测试结果。
· 控制被测试设备:如上节所述,当被测试系统处于死机等异常状态时,通过Perl脚本,远程控制可控电源,重启被测试系统,从而保证测试的连续性。
· 记录测试日志信息与测试报告:以文件形式记录测试日志,便于分析测试用例失败的原因。依据测试结果,汇总测试报告。
· 发送电子邮件:依据Perl提供的邮件模块-- Net::SMTP和MIME::Lite,建立邮件发送函数,将测试结果以附件形式发送给相关人员。
而目标机,则主要负责测试用例的执行,并反馈相应的测试日志。
3. 基于Perl的嵌入式软件自动测试框架在OpenMAX集成测试中的应用
OpenMAX是一个多媒体应用程序的标准,由NVIDIA公司和Khronos在2006年推出。OpenMAX架构可以加速操作系统和芯片平台的多媒体组件的开发、整合和编程,使库和编解码实现者能够快速有效的利用新芯片潜在的加速功能,而不关心下层的硬件结构[7]。
根据客户需求,公司提供了OpenMAX的IL(Integration Layer)层接口,为此开发了“基于Perl的自动测试系统”对其进行测试。测试系统程序流程图如下图2所示。
图2 基于Perl的OpenMax自动测试系统流程
该系统调用Perl脚本串口模块,实现宿主机与目标机系统的数据交互。并将发送命令、测试分析、结果统计等功能由CPU处理能力强的宿主机实现,而目标机只完成测试用例的运行,从而减少嵌入式被测试系统的CPU的负荷,减少由于测试系统而引入的测试偏差。
另一个需要注意的问题即如何判断当前测试用例是否运行结束,这就需要合理设计被测试系统的反馈信息,让被测试系统在每完成一个测试用例后,向串口反馈相同的结束语句,从而使宿主机在接收到相应的结束语句后,判断测试用例是否通过,并决定是否和怎样发送下一条测试命令。
总之,经过约不断的调试、测试,成功完成了该“基于Perl脚本的OpenMax软件自动测试系统”,有效提高了测试效率,很好的支持了公司内部OpenMax项目的开发以及相关客户,保证软件顺利交付。
4. 总结
嵌入式软件测试相对其他软件测试要困难得多,而嵌入式软件自动化测试面临更多的问题。“基于Perl的嵌入式软件自动化测试框架”,能够解决大多数嵌入式软件自动化测试面临的问题。基于该框架的“OpenMax软件自动测试系统”,实现了嵌入式OpenMAX软件的自动化测试,有效提高了测试效率。值得提出的是,该系统稍作改动和更新,也可以用于其他相关项目的测试,比如基于Android系统下的多媒体单元测试等。
参考文献:
[1]. 栾辉. 基于SOA的车载服务及软件开发设计与研究. 2022.
[2]. 郑人杰.计算机软件测试技术.北京:清华大学出版社,1992
[3]. Bart Broekman and Edwin Notenboom.Testing Embedded Software. 2003
[4]. 李庆诚,张建华,雷杨. 嵌入式系统的系统测试和可靠性评估.http://www.uml.org.cn/Test/200902197.asp
[5]. 户军茹. 嵌入式软件关联测试方法的研究. 西安:西安理工大学硕士学位论文,2007
[6]. 胡一飞. 嵌入式软件测试技术的研究及其在闪存文件系统测试中的应用. 上海:同济大学硕士学位论文,2007
[7]. OpenMax. http://www.hudong.com/wiki/OpenMax
[1]. 陈全员. 可视化技术在软件测试集生成中的应用. 同济大学硕士学位论文. 2005