金成杰 ,俎 涛 ,张焕欣
(1.上海中广核工程科技有限公司,上海 200241;2.北京火龙果网络技术有限公司,北京 100088)
嵌入式软件常用于汽车、飞机、工业控制等领域,很多与人身安全密切相关,为了保证软件的质量,会做尽可能多的测试:代码检查、单元测试、集成测试、系统测试等。 这些测试都有相应的测试对象、工具、质量报告,而且不同的嵌入式软件常常具有不同的运行环境。 以上因素造成了嵌入式软件测试的复杂性和挑战性。 下面就对嵌入式软件测试存在的问题进行解读,并提出相应的解决方案。
为建立完整的嵌入式软件测试工具方案,应全面分析其过程、角色、工具、数据,发现各环节存在的问题[1]。 目前嵌入式软件测试过程中存在以下问题:
(1)测试工作效率低:涉及多种测试工作,主要靠人工。
(2) 测试工具匮乏: 嵌入式软件的测试工具与测试环境密切相关,经常找不到特定的测试工具。
(3)难以获得完整的质量视图:不同测试工具输出的报告各不相同,没有一个综合的质量报告。
(4)测试工件缺乏管理:各种测试对象、测试环境、测试工具、测试脚本、测试报告,缺乏集中管理。
(5)复用率低:不同的测试项目具有类似的测试流程、工具、工件,但是需要重复搭建。
嵌入式软件测试的5 大问题是密切相关的,应该提供一个完整的嵌入式软件测试平台,目标如下:
(1)全周期流程建模:代码检查、单元测试、集成测试、系统测试[2];
(2)提供完整工具链:代码检查工具、单元测试工具、集成测试工具、系统测试工具;
(3)自动化执行全周期测试流程[3];
(4)把各测试工具输出的报告合成完整质量报告;
(5)建立测试工程仓库,集中管理各种被测程序、环境配置、测试用例、测试脚本、测试报告;
(6)提供项目级的整体测试资源复用能力。
嵌入式软件测试平台的方案概览如图1 所示。
图1 嵌入式软件测试平台的解决方案概览图
本研究项目在当前已有的嵌入式软件测试工具基础上,研发嵌入式软件测试平台,为测试工作提供集成解决方案。
为将上述的方案转化并形成最终的产品,需进行完整的架构设计,嵌入式软件测试平台的架构设计包括功能架构和软件开发架构。
嵌入式软件测试平台采用客户端和服务端的部署方式, 服务器分为管理服务器和测试服务器,相应的功能分配到各个部署节点,系统功能部署图如图 2 所示。
图2 嵌入式软件测试平台功能分配图
对应的子系统和功能分配如表1 所示。
表1 嵌入式软件测试平台的子系统和功能描述
为了实现开发的复用和扩展,平台采用了基于组件和面向服务的架构模式。 根据可复用、可扩展的原则,把公共部分提炼为应用框架和公共组件、公共服务,并提供了定制部分的接口和配置参数文件。 如下是开发架构的简要说明:
(1)采用可扩展的应用框架,可以通过配置扩展功能;
(2)客户端和服务端的接口采用 Restful 微服务技术;
(3)基于GDI+开发工作流建模,支持工作流复用;
(4)工作流配置用XML 格式文件存储,易于维护。
下面详细列出了各个子系统的组件设计和功能说明。 客户端子系统的组件模型如图3 所示,组件说明如表2 所示。
表2 客户端子系统的组件说明
图3 客户端子系统的组件图
管理服务子系统的组件模型如图4 所示,组件说明如表 3 所示。
表3 管理服务子系统的组件说明
图4 管理服务子系统的组件图
测试服务子系统的组件模型如图5 所示,组件说明如表 4 所示。
表4 测试服务子系统的组件说明
图5 测试服务子系统的组件图
嵌入式软件主要是基于 C、C++进行开发,运行在嵌入式操作系统环境之上,而嵌入式操作系统类型众多,包括嵌入式 Linux、VxWorks、Android、RTOS等。 这就需要构建一套能够满足各种嵌入式软件运行环境的测试工具[4-5]。 为此,本文提供了如下工具链:
(1)源代码相关的检查与测试选择了支持C/C++的工具:代码对比工具Beyond Compare,代码检查工具 CppCheck,单元测试工具 Gtest、C++Test。
(2)运行环境有关的工具提供 2 种支持[6-8]:
①针对不同的操作系统,提供对应的运行容器。例如,对于 VxWorks 操作系统,提供 Simics 运行容器,虚拟软件运行环境。
②在操作系统之上,构建一个数据总线。 在测试的时候,模拟各种通信的数据,屏蔽运行环境。数据总线采用了DDS 技术框架,如图 6 所示。
图6 软件运行容器和数据分发服务总线(DDS)
根据实际工作需要,收集、整理并集成嵌入式软件测试工具链,如表 5 所示[9-11]。
表5 完整的嵌入式软件测试工具链
嵌入式软件测试平台需要集成各种测试工具:代码检查工具、单元测试工具、集成测试工具、系统测试工具,这就需要可扩展的适配接口,通过配置参数快速引入新的测试工具[12-13]。 测试平台的接口关系如图 7 所示。
图7 嵌入式软件测试平台接口关系图
各种测试工具有不同的工作界面、命令、参数和报告样式。平台为不同的接口建立一个统一的配置参数结构。 当出现新的工具的时候,用户只需为该工具配置对应的接口参数[14]。
工具的基本描述信息属于基本属性,各个工具的数据结构都是相同的,而输入输出参数具体到不同的工具会有所不同,用户可以根据工具类型自定义输入输出参数。输入和输出参数的定义采用自定义结构的XML 数据格式,每个job 的配置信息独立存储为一个job 的 XML 文件。
将各个测试工具输出的报告集成到一个质量报告需要具备 2 个功能[15]:
(1)配置报告:建立各个测试工具输出的测试报告到综合质量报告的映射关系;
(2)报告生成:能够根据配置文件,读取各工具的测试报告,解析其中的数据,根据配置生成质量报告。
质量报告的配置参数包含:
(1)来源报告:来源报告名称和来源URL;
(2)目标报告:目标报告名称和输出的URL;
(3)报告构造器:不同的质量报告需要不同的报告构造器,为此抽象一个构造器基类,实现可扩展框架。
统一的质量报告生成流程图如图8 所示。
图8 综合质量报告生成原理示意图
本测试平台软件开发完成后进行了多个嵌入式软件测试项目的验证。 用户在测试平台操作界面上建立测试工作流,配置各个job 的工具、质量报告的组合关系,然后启动工作流,依次调用各个job 的工具、执行测试、输出测试报告,当所有测试都完成后,合成一个综合质量报告。 用户可以对测试过程的状态进行监控, 浏览最终的质量测试报告。 各个测试工作的执行记录如表 6 所示。 表7是平台使用前后的工作效果对比。
表6 嵌入式软件测试平台应用实例
表7 嵌入式软件测试平台应用效果表
嵌入式软件测试平台解决了嵌入式软件测试散乱的问题,提供了完整嵌入式软件测试方案:全周期测试过程建模、测试工具链、测试流程自动执行、合成质量报告,在嵌入式软件测试领域具有先进性和示范作用。 本测试平台经过多家企业的实际应用,有效地提升了嵌入式软件测试的效率和质量。同时本平台也发现存在下述待加强之处,例如:应支持更多的嵌入式测试工具,应能够支持更多嵌入式系统的测试环境,能够支持多个测试项目的并行执行。 针对以上的改进需求,笔者增强了平台的功能,部分需求已经完成改进,并计划持续提升完善,让测试平台具备更好的实用性和广泛的适用性。