嵌入式操作系统自动化测试方法研究
2022-11-26王国华许永建董晗方益栋
王国华,许永建,董晗,方益栋
上海微小卫星工程中心,上海 201203
0 引言
近年来,随着核高基[1]等重大科技专项的展开,我国基础软硬件发展的步伐越来越快,部分芯片和操作系统性能已经达到了和国际产品竞争的实力,也逐步形成了自己的软硬件生态链[2-3],为国家的军事装备、企事业单位等提供了有力的支撑和保障。
随着智能化的发展,嵌入式操作系统的应用也越来越广泛,大到火箭卫星、小到个人电子产品,都可以见到嵌入式操作系统的身影。目前我国在各个领域很大程度上仍依赖国外的操作系统,如风河的VxWorks、苹果的iOS以及谷歌的Android等。要实现装备自给自足,有自己的操作系统是非常重要的一环。但是研发操作系统涉及的技术面较广且过程漫长,保证操作系统的功能、性能、安全性、兼容性等符合使用需求十分重要。
软件测试是提高嵌入式操作系统软件质量的有效手段,软件测试主要是通过对操作系统提供的功能、性能、接口、兼容性、强度等指标的考核,验证操作系统是否满足用户使用的需要[4]。处于产品研制阶段的操作系统,版本迭代频繁,每一次的版本更新,都需要进行充分的测试,每一次的测试都需要将操作系统源码和测试脚本进行编译,在通过相关工具将镜像下载到目标机执行,最后对执行结果进行分析,此过程工作量大,测试人员重复劳动,不但浪费了人力财力,测试充分性也得不到保证。测试的许多操作是重复性的,注重严格按照流程进行的动作,故测试在整个软件研制过程中最容易进行自动化操作。但是目前对嵌入式操作系统自动化测试方法的探讨并不多见。为了提高操作系统软件测试效率,减轻人工操作强度,提升测试自动化水平,本文提出了一种嵌入式操作系统自动化测试方法,该方法利用Python脚本语言,结合版本控制工具、持续集成工具等,构建嵌入式操作系统自动化测试框架。保证嵌入式操作系统质量和可靠性。
1 软件组成
1.1 嵌入式操作系统测试流程
嵌入式操作系统是一种广泛用于工业制造、个人电子产品等领域的系统软件,通常包括外设驱动、系统内核、通信协议等模块,其开发环境与运行环境分离,宿主机安装集成开发环境、调试工具等,在宿主机上进行代码编写、模块裁剪、编译等操作,最终生成可加载文件,通过串口、调试器、网络等手段加载到目标机中运行,通过串口工具或网络等对目标机进行控制和监视。这也导致了嵌入式操作系统测试与其他软件测试的不同,如表1所示。
表1 嵌入式操作系统测试与其他软件测试区别
嵌入式操作系统测试环境如图1所示,主要包括宿主机、目标机、网络设备、串口设备等。
图1 嵌入式操作系统测试环境
在产品研发阶段,操作系统测试流程一般如图2所示,开发人员提交待测试软件至版本控制服务器(如SVN、Git等);测试设计人员编写测试脚本并入测试用例库;测试执行人员准备测试环境,主要包括宿主机、目标机、电源、串口工具、网线、外设以及代码加载工具(FTP、TFTP)等。同时从版本控制服务器和测试用例库获取最新软件版本和测试脚本,在宿主机中的集成开发环境中进行编译生成可加载镜像,通过代码加载工具等下载到目标机运行,并记录测试结果,汇总超时等待、异常等未执行完成以及测试未通过用例。对未通过用例、异常用例以及超时用例进行分析,若为测试脚本问题,修改测试脚本并入库,重新进行测试;若是软件问题,则对问题进行详细描述,将描述提交至问题库,开发人员对问题进行闭环,进入下一轮迭代,直至问题归零。最终对测试过程、环境、系统功能、性能、接口等指标满足情况进行说明,形成阶段测试总结报告。在产品研发初期,会涉及多轮软件的测试过程,也就意味着需要多次重复操作,而上述过程中的代码编译、镜像加载、测试结果分析等在整个测试过程中占用了很多时间,浪费了很多资源。
图2 嵌入式操作系统测试过程
1.2 系统组成
针对上述问题,本文提出了自动化测试框架,能够自主实现代码更新监测、代码编译、镜像加载、结果分析等功能,本框架主要包括持续集成服务器、仿真设备、测试控制主机、被测目标机、电源、版本控制服务器等组成,如图3所示。
图3 自动化测试框架
整个自动化测试过程都由“测试控制主机”进行统一管理,测试控制主机安装有集成开发环境、串口工具、Python脚本等,因此所有和测试过程相关的程序都在“测试控制主机”上统一运行。
测试管理的流程有以下几个步骤。
(1)测试人员在操作系统新版本提交之前,与开发人员、设计人员等进行沟通,确定测试范围,通过修改配置文件选择测试用例工程,即通过配置的方式或命令参数传入的方式确定本次测试的被测软件系统,以及本次测试所要执行的测试用例集。
(2)软件开发人员提交代码到版本控制服务器之后,持续集成工具检测到代码更新,从版本控制服务获取被测软件包并编译,生成操作系统库文件。
(3)安装在测试控制主机上的Python脚本文件根据第一步配置的参数从测试用例源码库获取最新的测试用例源码,并与操作系统库共同构建生成可加载镜像文件,同时配置镜像加载工具参数。
(4)测试调度,将对应的测试用例部署到具备测试条件的被测目标机上,启动测试用例的执行,生成测试期待的输入并记录测试用例的输出。
(5)测试人员判断测试用例执行结束、超时、无响应等状态,并收集测试用例输出结果。
(6)测试人员汇总并分析所有测试用例的运行结果,生成测试报告。
2 设计与实现
2.1 工具的选取
2.1.1 版本控制工具
软件在开发完成初期,可能面临频繁的版本迭代,此时最重要的问题就是软件版本的控制,而版本控制的核心任务则是能否查阅历史操作记录和实现协同开发。版本控制能追踪项目从开始到结束的过程,对编程人员而言,版本控制是团队协作的桥梁,有助于大型程序的多人同步开发。借助版本控制,项目被分割为多个模块,每个模块分配给不同的人员并行进行,从而提高了整体编程效率。操作系统产品开发阶段采用版本控制工具[5]进行软件版本管理是避免版本混乱、进行数据备份、提高代码质量、提高多人协同开发的效率,明确分工责任的有效途径。主流的版本控制工具包括Git、SVN、HG、CVS等,其中SVN是一款开放源代码的版本控制工具,具有目录版本控制、版本历史浏览、自动提交、分支管理、版本回退等功能,其速度快、安全性高、安装简单,可实现操作系统的代码版本控制。
2.1.2 持续集成工具
持续集成是一种软件开发过程中的连续动作,宗旨是避免集成问题,持续集成[6-8]强调开发人员提交了新代码之后,立刻进行构建、测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。目前国内外主流的持续集成工具主要有Jenkins、CircleCI、Travis CI等,其中Jenkins自诞生之日起,至今已发展了近20年,是较为成熟的持续集成工具,从理论上讲,可与任何类型的版本控制工具兼容,主要用于持续、自动地构建/测试软件项目、监控外部任务的运行。
2.1.3 Python简介
Python语言[9-10]诞生于上个世纪末,是一种解释型语言,提供了高效的数据结构同时还能支持面向对象编程,能够在Windows、Linux、macOS等操作系统中运行,其具有简单易学、易读、易维护、速度快、可移植性强等优点,同时具有大量的扩展库,利用扩展库可快速实现串口读写、文件解析等功能。在嵌入式操作系统测试脚本加载、过程监控、结果分析中使用Python语言进行设计,可以简化开发过程,减少维护成本。
2.1.4 镜像加载工具
嵌入式操作系统测试大多采用调试模式,即通过网络、串口等将操作系统镜像加载到目标机运行,通过串口进行控制以及结果查询。通过网络进行操作系统镜像加载的手段有TFTP或FTP等,不同的目标板配置不同,如龙芯处理器一般采用PMON引导程序,支持TFTP工具进行引导,而PowerPC平台一般采用FTP工具引导,较常用的TFTP工具是TFTPd32,该工具操作简单、使用方便。作为TFTP服务端,提供操作系统镜像加载功能。常用的FTP服务器软件如FTPserver,工具小巧且无需安装,此外也可利用嵌入式操作系统开发平台本身提供的FTP功能,进行操作系统镜像加载。
2.2 实现过程
首先对测试用例脚本做如下格式约定:在测试用例执行完成后输出{project:xxx,test_case:yyy,result:TESTFAIL}或{project:xxx,test_case:yyy,result:TESTPASS}。其中“project:xxx”为测试工程,“test_case:yyy”为project工程下的测试用例,如果用例执行失败则输出“TESTFAIL”,否则输出“TESTPASS”。工程内所有测试用例脚本执行完毕后输出“Tests finished!”作为整个工程运行结束标志。此外,确保测试脚本其余位置不能出现上述描述,Python脚本会根据格式约定的内容进行测试脚本执行结果的统计以及测试是否正常结束。
编写配置文件args.txt,配置文件用来指定测试用例镜像加载时相关参数,其中宿主机IP指的是安装了嵌入式操作系统开发环境的PC的网络地址,目标机IP指的是运行操作系统镜像的目标板网络地址。串口设备用来对目标机进行控制以及测试结果的显示等;workspace指定测试用例脚本所在工作空间,project指定需要测试的项目,此外还可设置波特率、目标板相关信息等。
#宿主机IP。
#例如:ipaddr=192.168.1.28;
#目标机IP(即目标板卡IP)。
#例如:ipaddr=192.168.1.28;
#变量serial指定串口设备。
#串口1:/dev/com1; 串口2:/dev/com2;......;
#例如:serial=/dev/com1;
#变量workspace指定工作空间目录;
#例如:workspace=E:workspace;
#变量proj指定需要测试的项目。
#如果不指定该选项,则默认测试工作目录下的所有项目。
#例如:proj=test_func test_perf test_strong test_safety test_elf;
#变量波特率,8641d 波特率是 9600;
baudrate=115200;
安装版本控制工具到版本控制服务器,软件开发人员开发完成代码后提交最新版代码至版本控制服务器;安装持续集成工具到测试控制主机,工具持续监测操作系统版本是否有更新,若有则从版本控制服务器获取最新版本并进行编译,更新集成开发环境中的操作系统库文件。
编写Python脚本,扫描开发环境中的操作系统库文件,判断操作系统库文件是否有更新,若有则从测试用例库获取最新测试用例,与操作系统二进制文件共同编译生成可加载镜像。编写Python脚本读取args.txt中的相关参数,配置FTP或TFTP工具中的加载参数,如IP地址信息、镜像路径信息、加载地址等。
安装TFTP或FTP工具,用于在Python完成加载参数配置和代码编译后,将操作系统镜像加载到目标机。
编写Python脚本根据目标机输出信息实时分析测试用例执行情况,判断用例是否正常结束、超时、无响应等状态,对长时间等待或无响应的用例及时做出相应处理,执行后续用例,直至测试用例全部执行完毕。
编写Python脚本对输出测试结果进行分析汇总,上报测试执行情况,提交测试问题,形成测试报告。同时为被测目标机清理测试环境并断电。
Python脚本在首次编写完成并运行正常后,后续测试无需修改。
在测试开始前将目标机与宿主机通过网线、串口线连接,修改网络IP地址,使宿主机与目标机在相同网段内,确保网络通畅;配置串口波特率、奇偶校验位、数据位、停止位等参数,使串口通信正常;目标机连接电源、配合测试的仿真设备、硬件外设等,电源开始加电。
本测试框架的工作流程如图4所示,其主要功能在于利用持续集成工具监测操作系统版本更新情况,完成操作系统镜像自动化编译,通过Python脚本控制TFTP或FTP工具完成镜像自动加载,利用Python脚本对串口进行控制,实现测试过程控制、对结果自动分析等。其中,仅在选择要测试的脚本动作上需进行人工操作,测试用例脚本编译、镜像加载、测试结果分析等步骤均可通过本框架自动执行,在一定程度上提高了嵌入式操作系统自动化测试水平,节约了人力成本。
图4 框架工作流程
3 结语
本文针对嵌入式操作系统自动化测试方法进行了探讨,分析了嵌入式操作系统的测试方法、测试过程、结果统计等方面。最终结合嵌入式操作系统测试现状,提出了依据软件加载工具、版本管理工具、持续集成工具以及Python语言的嵌入式操作系统自动化测试框架,该方法可实现测试脚本自动编译、镜像自动加载、测试自动执行、结果自动分析,测试过程无需人工干预,极大地减轻了测试人员的压力,提高了自动化程度,为嵌入式操作系统自动化测试提供了良好的途径。