APP下载

基于Docker的嵌入式软件测试研究

2020-02-04李耀周亚明罗辉黎毅辉

电子技术与软件工程 2020年12期
关键词:镜像文件宿主机测试环境

李耀 周亚明 罗辉 黎毅辉

(威胜信息技术股份有限公司 湖南省长沙市 410205)

嵌入式软件是运行在嵌入式系统上的一组针对特定硬件而设计的应用程序,这些应用程序通常是为了满足客户特定需求而预先定义的一套专用的软件,它不仅受制于特定的硬件资源限制,比如:CPU 频率、内存空间、存储空间等等,而且其功能还受限于接入嵌入式系统的外围硬件电路、元器件等所带来的影响。为实现电子设备设定的功能、成本、体积、功耗等要求,嵌入式软件必须强调软硬件的协同性、可靠性和可裁剪性,因此,针对嵌入式软件的测试远比传统软件的测试要更加复杂和困难。本文主要是结合嵌入式软件的特点,讨论如何利用Docker 容器技术具有的一些优势和特性对传统嵌入式软件测试过程中被测试对象的交付、安装和部署方法,对嵌入式软件测试环境搭建,测试工具使用等方面进行的改进和优化。最后通过在台区智能终端的应用,验证基于Docker 的嵌入式软件测试可有效降低测试复杂性、提升测试效率和提高资源利用率。

1 嵌入式软件测试面临的问题

随着物联网时代的到来,以及设备智能化的推广应用,嵌入式软件的质量和可靠性日益成为人们关注的焦点,与之相关的测试技术也逐渐受到研发人员和检测机构的重视。由于嵌入式软件的应用越来越广泛和深入,使得这些软件的规模与复杂度不断增长,不仅导致开发难度加大,而且针对嵌入式软件的测试也变得越来越复杂。但传统的软件测试技术还没有完全适应这种变化,已凸显出一些不足之处:

1.1 嵌入式软件测试难度越来越大

嵌入式软件测试是一项复杂性高、 综合性强的工作,不仅受制于特定硬件设计,而且受限于系统资源,需要测试人员具备较高的业务水平和较强的专业知识,才能发现被测对象可能存在的缺陷。同时,由于被测试嵌入式软件的交付大多是基于可执行程序或软件压缩包方式进行,需要手动搭建测试环境并配置各种所需的依赖关系,操作起来十分繁琐。随着电子设备的功能不断增多,其中的嵌入式软件规模与复杂度还在不断提高,依赖关系和包含的组件也越来越复杂。

1.2 嵌入式软件测试效率跟不上发布

随着开发迭代速度的加快,嵌入式软件更新频率已由原来以月、年为单位发展到现在的以天、周为单位,但嵌入式软件测试环境搭建复杂且不灵活,测试不同的软件或版本时,需要重复搭建多套测试环境,设置不同的相关参数,搭配各种不同的外接设备和检测工具,测试人员需要进行大量复杂的手工操作,有时还会因此产生错误或遗漏。测试的软件质量以及项目进度往往比预计的差很多,因而导致测试效率跟不上软件发布的节奏。

1.3 嵌入式软件测试环境利用率低

尽管搭建嵌入式软件测试的环境非常繁琐,但一套测试环境往往没办法并行测试多个不同版本或功能的嵌入式软件,因为大部分嵌入式软件都会独占系统的资源,同时彼此之间还会相互影响,这就导致搭建出来的测试环境利用率并不高,在相关硬件和配套外接设备都较为短缺时,这种情况更是雪上加霜。虽然还可以基于虚拟机方式搭建嵌入式软件测试环境,但这项技术本身非常消耗宿主机的资源,从而又会导致系统资源利用率降低。

图1:Docker 的总体架构

图2:嵌入式软件测试环境

图3:Docker 环境安装验证

图4:容器并行测试

目前面临的测试环境搭建复杂、测试效率不高、资源利用率较低的问题已成为嵌入式软件测试亟待解决的问题。在此情况下,结合嵌入式软件的特点,研究如何利用新的测试技术和方法来构建嵌入式软件测试过程,对降低测试复杂度、提升测试效率和提高测试资源利用率具有十分重要的意义。

2 嵌入式软件测试的相关研究

由于存在对硬件有较高的依赖性、受限于系统资源不足、开发环境与运行环境不一致等问题,针对嵌入式软件的测试通常会比传统的软件测试更加复杂。国外研究嵌入式软件测试技术开始于上个世纪七十年代,Robert L.Glass 在1980年发表的一篇文章[1],论述了嵌入式软件测试技术落后于传统软件测试技术的原因并给出了一些解决方案,对嵌入式软件测试技术的发展影响深远。国内研究首先是在国防领域开始对嵌入式软件测试技术和工具进行的。针对舰船嵌入式软件的特点,韩新宇等人[2]提出测试用例自动驱动方案,并基于此方案设计出测试用例自动驱动平台。王浩宇等人[3]在雷达嵌入式软件测试领域实现对Cuttle ISE 的应用。之后肖永健等人[4]研究出一种基于软件故障注入的逻辑覆盖测试平台。尽管嵌入式软件测试技术已得到广泛应用,但目前国内对嵌入式软件测试技术和工具的研究仍处于起步阶段,特别是很少考虑嵌入式软件测试环境搭建复杂、测试效率不高和资源利用率低的问题,这些问题却是影响嵌入式软件开发进度和成本的关键因素,仍需要进行深入的研究。

3 容器技术及工具的研究

3.1 容器技术的介绍

容器技术(Container)是一种新型的虚拟化技术,它是操作系统中一组受到资源限制且彼此间相互隔离的独立进程。相比传统的虚拟机技术,容器技术资源利用率更高效、软件封装性更简单、软件迁移和扩展更方便。Docker 是依托于Linux 内核的容器技术而发展起来的一种目前主流的容器引擎,它将底层系统、依赖环境、应用程序等进行统一打包,并形成一个整体的镜像文件,最后作为一个独立的容器部署在其他的平台或宿主机上。

3.2 Docker的总体架构

Docker 主要是实现应用软件层的虚拟化,通过沙盒机制可以保证在容器中运行的任何应用软件都是独立的,与外界的软件接口都是可控的,从而保障了数据的安全性和运行的可靠性。不同于其他虚拟化技术,Docker 直接运行在宿主机的操作系统之上,底层硬件并没有虚拟化,因而可用最小的硬件开销达到更高的计算能力,这也为Docker 在嵌入式系统上应用提供了理论依据和技术可行性。如图1 所示,Docker 的架构是基于Client-Server 模式设计的,服务端启动后会在宿主机上运行一个守护进程,客户端通过这个守护进程来远程控制Docker 容器的创建、运行、停止、删除等操作。

3.3 Docker的文件系统

Docker 的镜像文件是基于分层结构设计的,但其中并没有包含Linux 内核,只包含了运行所需要的文件系统结构。Docker 容器是镜像文件的运行态体现,Docker 容器的文件系统大部分来自镜像文件,其他为镜像新建的内容可分为初始层和读写层。初始层主要包括在初始化容器环境时产生的相关默认文件,而Docker 容器内的进程只能对读写层拥有写权限,其他层对进程而言都是只读的。这样从操作系统层面上就避免了软件被误删或破坏的可能性,即便被强制破坏,也可以通过Docker 的初始化命令恢复到初始状态。Docker 还使用了写入时复制技术(Copy-On-Write),所有运行中的容器可以先共享一个基础文件系统,当需要向文件系统进行写操作时,就引导它写到与该容器相关的另一个特定文件系统中,从而避免意外删除或修改基础文件系统,同时也避免通过文件系统改变自身容器以外的内容。

3.4 Docker的隔离与安全

不同于传统意义上的虚拟化技术,应用软件的隔离性与安全性是在操作系统之上由Docker 引擎来提供保证的。由于应用软件运行在容器中,并与其他容器中的应用软件和根文件系统进行隔离,因而宿主机的系统基本不会被应用软件或异常操作破坏。如果应用软件因受到外部攻击而瘫痪,只需要重启容器或启动一个新的容器即可恢复,并不需要重新启动宿主机,也不会影响到其他容器的正常运行。我们可以用Docker 在不同的容器中并行运行不同的应用软件,如果不再需要某个应用软件,就可以通过删除容器中的这个应用软件来完成,并且操作系统上不会因此留下任何临时文件。此外,Docker 还能确保每个应用软件只能使用分配给它的资源,包括CPU、内存、网络、存储空间等,不会因为程序缺陷或恶意行为占用到系统全部的可用资源,避免了因此导致系统性能降低或被拖垮。

4 Docker对嵌入式软件测试的改进

4.1 降低嵌入式软件测试的复杂性

测试人员不再需要为测试某个版本的应用软件重复安装操作系统、配置运行环境和设置相关参数,这些手动或半自动的复杂操作,极容易人为引入一些操作错误或遗漏某些步骤。基于Docker 镜像的嵌入式软件测试已将这些复杂的配置过程封装起来,不仅减少了重复的操作,还让测试过程的整体复杂性最小化。

4.2 提高嵌入式软件测试环境利用率

基于Docker 的嵌入式软件测试可使得一套测试环境能够同时用于多个不同软件的测试中,而且彼此之间并不会受到太多相互影响。特别是在样机测试阶段,相关的硬件和配套的外围设备都较为短缺,此时不仅可以提高测试环境和专用设备的利用率,而且还降低了为搭建多套测试环境所产生的费用。

4.3 提升嵌入式软件的测试效率

由于不再需要重复搭建多套测试环境、也不需要准备过多的硬件检测设备,只需要通过容器管理工具将包含测试对象的Docker镜像文件部署到测试环境中,就可以很快在相关的应用场景中开始测试。因而嵌入式软件测试的效率得到极大提升,特别是在做回归测试和现场验证时,相比传统的方式更有优势。

5 基于Docker的嵌入式软件测试

台区智能终端是一种由我司研制的用于配网供用电信息采集、电能表和各类传感器数据收集、设备状态监测等功能于一体的智能化电力电子设备。它的核心主板硬件提供了ARM Cortex-A7 架构四核CPU、2GB DDR3L 内存、4GB eMMC 存储器,目前搭载的操作系统是ARM 32bit 版本的Ubuntu16.04 发行版。同时配有4 个UART 接口、载波模块、时钟芯片、4G 模块、GPIO、以太网等丰富的接口和外接器件。如图2 所示,以下将基于台区智能终端搭建一整套嵌入式软件测试环境。台区智能终端安装在电气柜的左上角,下方通过RS485 接入了漏电保护器、智能开关、三相电能表、末端感知装置及负载,台区智能终端的操作系统上部署了Docker,同时通过自编写的C/C++应用程序,实现数据的采集与存储。

5.1 Docker环境的搭建

首先通过以太网登陆到台区智能终端的Linux 控制台,并在设备的宿主机中安装Docker 服务。可以通过Docker 官方指导文档进行远程安装Docker 服务,具体操作命令为:“curl -fsSL get.docker.com -o get-docker.sh”和“sh get-docker. sh”,安装完成后如图3 所示。可以通过命令“docker exec -it c_data /bin/bash”进入运行中的Docker 容器,查看应用程序在容器内部的执行情况。另外,还可以在PC 主机的交叉编译环境下编译ARM 版本的应用程序,再采用Dockerfile 的方式将生成可执行程序和运行所需的配置文件整合打包进Docker 镜像文件中,最后通过部署该镜像文件到启动Docker容器中,就能实现自己编写的应用程序在Docker 容器中运行。

5.2 容器并行测试验证

使用Docker 主要就是为了能够在不同的容器中同时运行多个应用程序,这样就可以提高嵌入式软件测试环境的利用率,提升嵌入式软件测试的效率。如图4 所示,以下利用自己编写的三个嵌入式程序打包生成的Docker 镜像:数据中心c_data、数据采集c_base和IEC104 协议c_104,连同搭载Docker 的台区智能终端组成一套测试验证环境。验证的思路是先后启动容器加载这三个Docker 镜像,分别利用数据采集c_base 完成数据的收集,利用数据中心c_data 完成数据的存储,利用IEC104 协议c_104 完成数据上送到主站。由于Docker 下的容器运行采用的是沙盒机制,因而各容器是互相独立的,并且互不影响。首先由数据采集c_base 收集外接设备的各类电参量实时数据,并写入数据到数据中心c_data,交由数据中心c_data 完成数据的存储。此时主站可通过IEC104 协议c_104 同时向台区智能终端召测所需数据,然后由IEC104 协议c_104 向数据中心c_data 发出读取数据的命令,并由数据中心c_data 完成读取数据的返回。三个嵌入式程序分别安装在不同的容器中,相互之间收发数据都只允许通过TCP 或UDP 的网络连接进行。

利用Docker 容器技术,可以实现运行于不同环境下的嵌入式程序在同一台宿主机中共存,Docker 通过隔离底层操作系统与应用软件,做到了嵌入式软件运行环境的统一,不仅降低了嵌入式软件开发过程中依赖运行环境所做的大量移植工作,而且通过Docker的核心组件还可以为应用软件的组合、镜像文件的制作提供便利的工具和方案。

6 结束语

嵌入式软件因其架构的特殊性,测试起来并不像传统软件那样简单容易。而随着物联网的蓬勃发展、各类设备功能的日益强大,业务需求的不断增加,也导致针对嵌入式软件的测试愈发复杂。在众多测试方案中,基于Docker 的嵌入式软件测试优势明显,不仅占用系统资源少、运行环境统一,而且启动速度快、安装部署方便,大幅降低测试人员的工作量。通过在台区智能终端上验证基于Docker 的嵌入式软件测试环境,充分挖掘出其应用潜能,并为降低嵌入式软件测试的复杂度,提升嵌入式软件的测试效率,提高测试环境和测试资源的利用率带来帮助。

猜你喜欢

镜像文件宿主机测试环境
虚拟网络实验室在农村职校计算机网络技术教学中的应用研究
一种快速拷贝数据到FAT分区的方法
用RamOS降低公用机的维护工作量
Win7升级Win10教程
在不连接网线的情况下Windows与VM之间如何ping通