范琳+王海
摘 要: 深入研究嵌入式软件的白盒测试技术,提出基于宿主平台的嵌入式软件测试构架。针对语句覆盖测试,提出一种基于顺序块的插桩方法,能有效减少桩的个数,从而减少桩函数对测试过程的影响。针对分支覆盖率测试,插桩后的被测程序运行在ARMulator上,桩获取器分析桩信息,得出程序运行中的实时语句覆盖率。实现了嵌入式软件测试平台ARM?Test,实验证明:该模型能获取实时的语句覆盖率,有效进行白盒测试。
关键词: 嵌入式模拟器; 顺序块; 插桩; 白盒测试
中图分类号: TN710?34; TG335.58 文献标识码: A 文章编号: 1004?373X(2014)18?0140?03
An instrumentation method based on sequence block for embedded software
white?box testing
FAN Lin1, WANG Hai2
(1. Department of Computer Science and Technology, Xian University of Posts and Telecommunications, Xian 710121, China;
2. School of Information Science & Technology, Northwest University, Xian 710069, China)
Abstract: An embedded software testing framework based on hosting platform is proposed on the basis of in?depth study of the white?box testing technology for embedded softwares. An instrumentation method based on sequence block is brought forward to conduct statement coverage testing, which can effectively reduce the number of stubs, so as to reduce the impact of stubs on the testing process. After instrumentation, the program under test was run on ARMulator. The stub information is analyzed by the stub receiver to get the real?time statement branch coverage. An embedded software testing platform ARM?Test was developed. The experiment results show ARM?Test can get real?time statement branch coverage and do white?box testing effectively.
Keywords: embedded system simulator; sequence block; instrumentation; white?box testing
0 引 言
随着嵌入式系统的广泛应用,人们对嵌入式设备的稳定性和可靠性提出了更高的要求。由于目标机与宿主机硬件环境不同,使用的是不同体系结构的处理器,嵌入式软件无法在宿主机上直接运行与测试[1?4],将嵌入式模拟器应用于嵌入式软件的开发与测试,能使得软件与硬件并行开发。在宿主机上建立起一个内核与外设均可配置与裁剪的模拟器,使得硬件还没有开发出来时,软件就能在模拟器上运行和测试,就像在真正的硬件系统运行上一样[5?7]。
本文采用ARM公司提供的源内核模拟器ARMulator搭建嵌入式测试平台,针对源码进行基于顺序块的插桩,进行语句覆盖率测试,能在宿主平台通过ARMulator实时获取桩数据并进行分析,得到程序运行过程中的语句覆盖率,以实现软硬件开发的同步,保证嵌入式系统的质量。
1 已有研究
目前实用的嵌入式系统测试平台主要由国外厂商开发,比较具有代表性的测试平台有Teleloglc公司的Logi?scope,Metrowerks公司的CodeTest,Windriver公司的CoverageScope和IPL公司的Cantata等。但一套测试系统价格往往高达数万到十多万美元,极大增加了嵌入式系统的开发成本[8?10]。ARM公司提供嵌入式系统模拟器ARMulator,能在宿主机上提供嵌入式软件运行环境 [11]。
北京大学、北京航空航天大学进行了一系列的软件分析和测试工具的研究与开发,研制了一系列的测试工具,代表性的工具有SafePro C/C++,SafePro/java。西北工业大学在航空软件仿真测试、并行软件综合测试平台及C/S系统的测试方面进行了许多研究工作并取得一些成果 [1?4]。
2 基于宿主机的嵌入式软件白盒测试技术
2.1 基于宿主机的嵌入式软件测试构架
本文提出了基于宿主平台的嵌入式软件测试构架。在宿主机上搭建嵌入式测试平台,内部加载嵌入式模拟器,使得嵌入式软件具备运行环境;在进行白盒测试时,首先对被测程序进行插桩,桩函数在程序运行过程中能同步的、实时的输出预设的桩信息。使用桩信息分析器接收桩信息,并进行分析和计算,能实时获取整个程序运行过程中的语句覆盖和分支选择情况。
2.2 被测程序的处理流程
被测程序的处理流程如图1所示,具体为:
(1) 对源程序进行规范化,规范化的过程包括了词法分析、语法分析和代码整理。
(2) 对规范化后的程序进行顺序块划分,并统计每个顺序块的信息:块起止行号、块内语句数、顺序块总数等。
(3) 由测试平台自动插入不同的桩函数,经过编译、链接后,生成嵌入式映像文件,能运行于嵌入式模拟器之上。在动态测试阶段通过运行目标代码将桩信息发送至桩信息分析器,以获取程序运行过程中的语句覆盖率。
图1 被测程序处理流程
2.3 基于顺序块的插桩技术
本文中将被测程序划分为若干顺序块,针对顺序块进行插桩。有如下定义:
顺序块:若干相连顺序语句的集合,是一段不包含任何分支、循环或函数调用的顺序程序段。一个顺序块中所有语句的执行次数相同。在程序插桩时,只需对顺序块的开始或结尾处插桩即可,避免了对每条语句的重复插桩,减少了测试过程对程序运行的影响。
遍历整个程序,统计可执行语句的总行数,并进行顺序块划分。非可执行语句不在统计的范畴内。从第一条可执行代码开始处理,遇到以下内容时当前顺序块结束:
(1) 循环语句关键字for,do,while,do until;
(2) 分支语句关键字if,else if,else及end if ;
(3) 函数调用语句;
(4) return语句。
在对被测程序进行顺序块划分后,针对每个被测程序建立分块信息[Bl[N]],[N]为总分块数。
[Bl[n]={n,Start,End,Lines},n∈[0,N) ]
其中[n]是顺序块的编号,[Start]是起始行号,[End]是结束行号,[Lines]是该顺序块的行数。
分块后在源程序头添加全局变量的定义和桩函数的声明:
[staticintblock=0; voidsendstub();]
在每个块结束的位置插入下列语句,其中[n]为当前块的块号,[sendstub]函数发送信息到桩信息分析器:
[block=n;sendstub(block); ]
以上插桩过程由函数自动进行。在进行语句覆盖测试时,先发送[Bl[N]]信息到桩信息分析器。然后在程序运行过程中,实时由桩函数[sendstub]发送当前执行的块号到桩信息分析器,以计算实时的语句覆盖率。
本文采用了进程间通信的方式,在嵌入式模拟器中维护一块共享内存,每次桩函数将要发送的信息写入共享内存,并通过Windows消息通知桩信息分析器取走数据。这样桩信息分析器就能实时获取桩数据,并绘制出实时的覆盖率曲线。
在每个顺序块后调用桩函数,桩函数的作用是发送桩信息到桩信息分析器,由桩信息分析器实时分析程序运行过程中的覆盖率。为尽量减少模拟器和桩信息分析器之间的数据传输,桩函数只需将当前顺序块号[i]发送给桩信息分析器,当执行到桩函数时,证明当前顺序块已被完全执行,桩信息分析器就能及时更新其程序覆盖率的值。
在语句覆盖测试中,设桩信息分析器在测试过程中动态获取的信息为:[{i1,i2,…,ik}?[0,N)],如果有重复块号说明该块被执行了不止一次。其中不重复块号组成集合[?],则语句覆盖率[Cs]为:
[Cs=n∈?Bln→Linesn=0N-1Bln→Lines×100%]
3 系统实现
项目组基于ARM内核模拟器ARMulator开发嵌入式测试平台ARM?Test,能实现嵌入式程序的白盒测试,在被测程序或工程经过预处理、插桩、编译、链接后,生成可执行文件运行于嵌入式模拟器之上,运行过程中实时将桩信息发送出来,经分析器获取并处理,获得实时的语句覆盖率和分支覆盖率。系统界面及测试效果如图2,图3所示。
图2 ARM?Test界面
图3 某例子程序的语句覆盖率
4 结 语
本文提出一种基于顺序块的插桩方法,能进行语句覆盖测试。测试过程中能对桩信息实时处理获得动态的语句覆盖率曲线,以实现软硬件开发的同步,保证了嵌入式系统的质量。测试方法仅针对语句覆盖率,后期还需进行分支覆盖、条件覆盖测试。
参考文献
[1] 盛云龙.基于组合覆盖的嵌入式软件测试平台研制[D].哈尔滨:哈尔滨工业大学,2013.
[2] 叶永鑫.嵌入式软件测试平台的研究与实现[D].北京:北京交通大学,2010.
[3] 吕金和.嵌入式软件测试[J].软件导刊,2010(9):40?41.
[4] 王荧.嵌入式软件可靠性测试工具的研究与实现[D].成都:电子科技大学,2009.
[5] Bill Blunden.虚拟机的设计与实现[M].北京:机械工业出版社,2003.
[6] 范琳,王忠民,王海.基于嵌入式系统模拟器的测试平台构架[J].微计算机信息,2010(17):61?62.
[7] 范琳,王忠民,梁琛,等.基于Proemulator的插桩构架研究[J].现代电子技术,2010,33(3):188?190.
[8] 蒋崇武,杨顺昆,刘斌.面向嵌入式软件测试的仿真建模[J].计算机工程,2008,34(4):87?89.
[9] 祝义.嵌入式软件需求规约到软件体系结构模型的转换研究[D].南京:南京航空航天大学,2011.
[10] HAN Alex Heunhe, AHN Yong?Ho, CHUNG Ki?Seok. Virtual ARM simulation platform for embedded system developers [C]// ITC?CSCC. [S.l.]: ITC, 2008: 253?256.
[11] 周立功.ARM嵌入式系统基础教程[M].北京:北京航空航天大学出版社,2007.