宿主环境下嵌入式软件白盒测试方法
2014-07-18王忠民
范 琳, 王忠民
(西安邮电大学 计算机学院, 陕西 西安 710121)
宿主环境下嵌入式软件白盒测试方法
范 琳, 王忠民
(西安邮电大学 计算机学院, 陕西 西安 710121)
针对嵌入式系统软硬件开发不同步的问题,提出一种宿主环境下嵌入式软件白盒测试方法。采用基于顺序块的插桩方法来实现语句覆盖测试,采用基于逻辑树的插桩方法来实现分支覆盖测试,在被测程序运行过程中由嵌入式模拟器实时发送桩信息到分析器,由分析器计算得到语句与分支覆盖率。实验表明,该方法能实时获取嵌入式软件测试过程中的语句和分支覆盖率,测试效果良好。
嵌入式模拟器; 顺序块; 逻辑树; 插桩; 白盒测试
随着嵌入式系统的广泛应用,人们对嵌入式设备的稳定性和可靠性提出了更高的要求。嵌入式系统的软件与目标硬件紧密相关,一般在原型板调试时才开始进行底层嵌入式软件的测试调试工作[1-2]。为了加快项目的开发进度,确保嵌入式软件的质量,应该在硬件原型板制板之前开始嵌入式软件模块调试,即在没有硬件原型板时先尽可能地调试并解决嵌入式软件编程方面的错误。由于目标机与宿主机硬件环境不同,使用的是不同体系结构的处理器,嵌入式软件无法在宿主机上直接运行与测试[3-4],将嵌入式模拟器应用于嵌入式软件的开发与测试,软件在模拟器上运行和测试[5],能使得软件与硬件并行开发。
目前实用的嵌入式系统测试平台主要由国外厂商开发,比较具有代表性的测试平台有Teleloglc公司的Logi-scope[6],Metrowerks公司的CodeTest[7],Windriver公司的CoverageScope和IPL公司的Cantata等[8]。但一套测试系统价格往往高达数十万甚至上百万美元,极大增加了嵌入式系统的开发成本。目前国内软件测试研究进行的比较少,深圳领测科技有限公司推出嵌入式产品白盒测试工具VcTester[4],非开源免费软件。以上嵌入式测试平台功能复杂,安装与使用门槛较高,不方便使用。
本文采用ARM公司提供的嵌入式模拟器ARMulator[9]来搭建嵌入式测试平台,提出一种针对嵌入式软件白盒测试的自动插桩方法,能在代码动态测试过程中,实时获取程序的语句和分支覆盖率。
1 工作原理
在宿主机上搭建嵌入式测试平台,内部加载嵌入式模拟器,使得嵌入式软件具备运行环境。在进行白盒测试时,国际上一般采用插桩的方式,测试过程中首先对被测程序进行插桩,插入的桩信息就像是播撒在程序内部的多个传感器,在程序运行过程中能同步的、实时的输出预设的桩信息[10-13]。使用桩信息分析器接收桩信息,并进行分析和计算,能实时获取整个程序运行过程中的语句覆盖和分支选择情况。基于宿主平台的嵌入式软件测试构架如图1所示[11]。
图1 基于宿主平台的嵌入式软件测试构架
2 嵌入式软件白盒测试方法
先将被测程序划分顺序块后,按其结构生成逻辑树,再进行插桩,被测程序运行过程中将桩信息发送出来,以实现白盒测试。
2.1 被测程序的处理流程
目前基于ARM的嵌入式软件开发以C语言以为主,考虑嵌入式C程序测试,被测程序的处理流程如图2所示。首先对被测程序进行预处理,包括代码规范化和顺序块划分,然后对规范化的程序进行插桩、编译、链接,生成可执行文件,加载到嵌入式模拟器,运行过程中实时将桩信息发送出来,经分析器获取并处理,获得程序覆盖率。整个处理流程分为3步。
(1) 对源程序进行规范化,规范化的过程包括了词法分析、语法分析和代码整理。具体任务为:识别源程序中的各个基本的语法单元,删除无用的空格、tab、回车键和注释,将没有加上“{、}”的单条分支语句或者循环语句加上“{、}”,将程序划归为统一的格式。
(2) 对规范化后的程序进行顺序块划分,并统计每个顺序块的信息:块起止行号、块内语句数、顺序块总数等,这个过程在插桩之前进行,避免在桩函数中进行顺序块的统计,降低了插桩对被测程序的影响,以减少桩函数对测试效果的影响。
(3) 测试人员选择不同的白盒测试方法,由测试平台自动插入不同的桩函数,桩函数由嵌入式C撰写,经过编译、链接后,生成嵌入式映像文件,能运行于嵌入式模拟器之上。在动态测试阶段通过运行目标代码将桩信息发送至桩信息分析器,以获取程序运行过程中的语句、分支覆盖率。
图2 被测程序处理流程
2.2 划分顺序块
在插桩时,选择插桩位置很重要。为了获得程序运行中的语句覆盖率,需得到语句的运行情况。将被测程序划分为若干顺序块,针对顺序块进行插桩。
顺序块可定义为若干相连顺序语句的集合,是一段不包含任何分支、循环或函数调用的顺序程序段;只有一个入口语句和一个出口语句,一个顺序块中所有语句的执行次数相同。在程序插桩时,只需对顺序块的开始或结尾处插桩即可,从而避免了对每条语句的重复插桩,减少了测试过程对程序运行的影响。一个顺序块可以表示为
Block = { line1;
line2;
……
linei;}
遍历整个程序,统计可执行语句的总行数,并进行顺序块划分。以下语句均不是可执行语句,不在统计的范畴内:头文件的引用所在行、函数的声明、宏定义、函数定义的函数名所在行、每个函数刚开始的变量定义所在行、单独的大括号作为一行及空行。
从第一条可执行代码开始处理,遇到以下内容时当前顺序块结束:
(1)循环语句关键字for、do、while、do until;
(2)分支语句关键字if、else if、else及end if ;
(3)函数调用语句;
(4)return语句;
在对被测程序进行顺序块划分后,针对每个被测程序建立分块信息
Bl[n]={n,Start,End,Lines}(n=0,1,…,N-1),
其中N为总分块数,n是顺序块编号,Start是起始行号,End是结束行号,Lines是该顺序块的行数,满足
(Bl[n]→Lines)=
(Bl[n]→End)-(Bl[n]→Start)+1;
分块后在源程序头添加全局变量的定义和桩函数的声明
staticintblock= 0;
voidsendstub();
在每个块结束的位置插入下列语句,其中n为当前块的块号,sendstub函数发送信息到桩信息分析器
block= n;
sendstub(block);
以上插桩过程由函数自动进行。在进行语句覆盖测试时,先发送Bl[n]信息到桩信息分析器。然后在程序运行过程中,实时由桩函数sendstub发送当前执行的块号到桩信息分析器,以计算实时的语句覆盖率。
2.3 生成逻辑树
划分顺序块后,对整个程序进行逻辑分析。当遇到if-else、switch、while、for、do-while语句时,分别生成下列逻辑树。
逻辑树可定义为用于表示整个程序流程的有向图,其中边表示程序运行的顺序,圆形表示程序中的模块,实心圆点表示程序中的分支。对每个模块进行迭代处理,使得每个模块都是顺序块时,逻辑树生成完毕。
依图3划分逻辑树,其中图3(a)表示if-else分支程序的逻辑树,图3(b)表示while,for循环程序的逻辑树,图3(c)表示switch多分支结构的逻辑树,图3(d)表示do-while语句的逻辑树。
(a)if-else语句逻辑树 (b)while、for语句逻辑树
(c)switch语句逻辑树 (d)do-while语句逻辑树
图3 不同程序结构的逻辑树
针对每个被测程序建立分支信息
Br[m]={m,Style,is_loop}(m=0,1,…,M-1),
其中M为总分支数,m是分支编号,Style是分支的类型,用不同数字分别表示if,if-else,switch,while,for,do-while,is_loop表示该分支是否为循环。
在源程序头添加全局变量定义和桩函数声明
staticintbranch= 0;
voidsendstub();
在每个块结束的位置插入语句,其中n为当前块的块号
branch= n;
sendstub(branch);
在进行分支覆盖测试时,先发送Br(m)信息到桩信息分析器。然后在程序运行过程中,实时由桩函数sendstub发送branch信息到桩信息分析器,以计算实时的分支覆盖率。
2.4 桩信息发送与接收
基于模拟器的嵌入式软件测试中,一个难点就是如何获取桩信息。一般采用的方法都是将桩信息写入文件,在测试结束后通过分析文件来获得最终的语句或分支覆盖率。这种方法不能实时获取桩信息,而程序测试过程中,其覆盖率变化曲线的转折点一般都包含重要信息,比如某些很少被执行的语句在输入特殊的测试用例时被执行了。获取这些信息对于动态测试具有很重要的意义,因此实时获取桩信息来绘制覆盖率变化曲线很重要。
本文采用了进程间通信的方式,在嵌入式模拟器中维护一块共享内存,每次桩函数将要发送的信息写入共享内存,并通过windows消息通知桩信息分析器来取走数据。这样桩信息分析器就能实时获取桩数据,并绘制出实时的覆盖率曲线。
2.5 桩信息分析
在每个顺序块后调用桩函数,桩函数的作用是发送桩信息到桩信息分析器,由桩信息分析器实时分析程序运行过程中的覆盖率。为尽量减少模拟器和桩信息分析器之间的数据传输,桩函数只需将当前顺序块号i发送给桩信息分析器,当执行到桩函数时,证明当前顺序块已被完全执行,桩信息分析器就能及时更新其程序覆盖率的值。
在语句覆盖测试中,设桩信息分析器在测试过程中动态获取的信息为{i1,i2,…,ik},则顺序块的执行顺序为{i1,i2,…,ik},其中如果有重复块号说明该块被执行了不止一次。其中的不重复的块号组成集合φ,则语句覆盖率Cs为
在分支覆盖测试中,设桩信息分析器在测试过程中动态获取的信息为{j1,j2,…,jl},此即分支的执行顺序,其中不重复的分支号组成集合γ,则语句覆盖率Cb为
其中Bi表示所有分支的语句数,Bj表示被执行分支的语句数。
3 系统实现
基于PC平台,windows7.0操作系统,开发出嵌入式测试平台ARM-Test,如图4所示。在平台上打开单个嵌入式.c文件或.mcp工程文件,对文件进行规范化、顺序块划分、生成逻辑树、插桩、编译、链接和运行,以实现语句覆盖测试和分支覆盖测试。对4段典型的含有循环和分支的程序进行测试,其语句覆盖率和分支覆盖率如图5和表1所示。
图4 ARM-Test界面
(a) 程序1的语句(上)和分支覆盖率(下)
(b) 程序2的语句(上)和分支覆盖率(下)
(c) 程序3的语句(上)和分支覆盖率(下)
(d)程序4的语句(上)和分支覆盖率(下)
图5 4段程序的语句覆盖率和分支覆盖率
表1 4段程序的语句与分支覆盖率曲线的转折点及桩号
覆盖情况程序1语句覆盖分支覆盖程序2语句覆盖分支覆盖程序3语句覆盖分支覆盖程序4语句覆盖分支覆盖桩号11111111转折点33%100%20%100%33%100%8%25%桩号22292转折点67%40%67%73%50%桩号22352103转折点100%60%100%92.5%75%桩号2024转折点100%100%
从测试曲线和曲线转折点可以看出,对于4段程序,测试平台均能准确给出程序执行过程中的语句和分支覆盖率。以往测试平台只能给出最终的覆盖率,本文开发的系统能实时给出程序运行过程中的覆盖率,并显示覆盖率曲线中的转折点,更有利于测试人员发现被测程序的问题。
4 结束语
提出一种宿主环境下嵌入式软件白盒测试方法,并实现了嵌入式测试平台ARM-Test,能实时给出程序运行过程中的覆盖率,并显示覆盖率曲线中的转折点,方便测试人员发现问题,解决了嵌入式系统硬件原型平台没有开发出来之前嵌入式软件的开发与测试问题。
[1] 盛云龙.基于组合覆盖的嵌入式软件测试平台研制[D]. 哈尔滨工业大学, 2013:1-5.
[2] 叶永鑫. 嵌入式软件测试平台的研究与实现[D]. 北京交通大学, 2010:3-6.
[3] 吕金和. 嵌入式软件测试[J]. 软件导刊, 2010,9(9):40-41.
[4] 王荧. 嵌入式软件可靠性测试工具的研究与实现[D]. 成都:电子科技大学, 2009:3-5.
[5] Bill Blunden. 虚拟机的设计与实现[M]. 北京:机械工业出版社,2003:20-150.
[6] 蒋崇武, 杨顺昆, 刘斌. 面向嵌入式软件测试的仿真建模[J]. 计算机工程, 2008,2(34):87-89.
[7] 祝义. 嵌入式软件需求规约到软件体系结构模型的转换研究[D]. 南京航空航天大学, 2011:7-8
[8] Alex Heunhe Han, Yong-Ho Ahn, Ki-Seok Chung. Virtual ARM Simulation Platform for Embedded System Developers[C]//ITC-CSCC, Yamaguchi, Japan, 2008:253-256.
[9] 周立功. ARM嵌入式系统基础教程[M].北京:北京航空航天大学出版社, 2007:50-60.
[10] 范琳, 王忠民, 王海. 基于嵌入式系统模拟器的测试平台构架[J]. 微计算机信息, 2010(17):61-62.
[11] 范琳, 王劲松, 王文浪. 基于嵌入式模拟器的桩数据获取模型研究[J]. 东北大学学报, 2011,32(1A):61-65.
[12] 王忠民,周爱玲,范琳. 基于树形控件的测试工程管理架构[J]. 西安邮电学院学报, 2011,16(2):26-28.
[13] 张晓晖,王忠民,王文浪. 嵌入式软件静态测试技术研究[J]. 西安邮电学院学报, 2011,16(2):38-41.
[责任编辑:祝剑]
Research on host-based white-box testing of embedded software
FAN Lin, WANG Zhongmin
(School of Computer Science and Technology, Xi’an University of Posts and Telecommunications, Xi’an 710121, China)
An embedded software testing method based on hosting platform is proposed for in-depth study of white-box testing of embedded software technology. An instrumentation method based on sequence block is brought forward to do statement coverage testing, which can effectively reduce the number of stubs and thus reduce the impact of the testing process. An instrumentation method based on Logic tree is proposed to do branch coverage test. After instrumentation, the program is run on ARMulator. Stub information is analysed by the stub receiver in real time to get the statement and branch coverage. An embedded software testing platform is developed for the ARM-Test. The experiemtns show that ARM-Test can get real-time statement and branch coverage, and do effective white-box testing.
embedded system simulator, sequence block, logic tree, instrumentation, white-box testing
10.13682/j.issn.2095-6533.2014.05.021
2014-04-18
国家自然科学基金资助项目(61373116);西安邮电大学青年基金资助项目(103-0458)
范琳(1982-),女,硕士,讲师,从事嵌入式测试系统、机器学习研究。E-mail:fanlin@xupt.edu.cn 王忠民(1967-),男,博士,教授,从事人工智能、嵌入式系统等研究。E-mail:zmwang@xupt.edu.cn
TG 335.58
A
2095-6533(2014)05-0106-06