摘要:针对嵌入式系统汇编语言词法、语法分析的设计与实现,提出了Lex与Yacc之间的关系,然后两者通过gcc命令进行编译形成综合分析。最后运行该综合分析器就可以对51系列的汇编语言进行分析。提出了被测源程序静态结构的分析方法,建立了程序流程图的过程,除此之外,还强调了被测源程序插桩处理与覆盖率分析的具体理论和使用规则,这为黑盒测试结果提供了科学的方法。
关键词:黑盒测试;嵌入式系统;程序流程图;插桩处理
引言
黑盒测试是从用户观点出发的测试,依据需求功能说明书中的预期用途、定时和性能的要求,推断测试结果。黑盒测试根据测试阶段可分为单元测试、集成测试、确认测试、系统测试四个阶段[1]。嵌入式计算机系统具有与传统软件测试不同的新特性,因此需要采取针对性的测试方法。通用的测试方法可分为静态时间分析和动态时间分析。
1嵌入式软件测试的环境分析
在线仿真配备了CPU芯片接口,提供和应用程序交流信息桥,不足之处在于对硬件的依赖性较强,测试范围较窄;目标机仿真测试结果真实,但由于实际运行中连接外部设备,很难辨识软件和硬件错误。在实际测试中,根据测试效率、成本、可靠性、自动化程度等因素选择测试环境[2]。
2嵌入式测试系统的技术实现
CodeTest一方面吸取软件插桩技术,另一方面从硬件测试那里吸取从总线获取数据的技术,并进行升级改造。在硬件测试时,CodeTest选择插入点的方式为主动获取关键数据。和CodeTest相比,纯软件测试对目标测试的影响大大降低。因此选用Cereal仿真器。嵌入式软件测试系统由功能测试模块、代码测试模块、数据分析和文档报告模块、通信接口转换模块组成。对于黑盒测试来说,功能测试模块居主导地位,它主要通过接收目标系统输出信号和需要的信号进行比对来判定目标系统在功能上是否达到最优[3]。
3词法语法分析的设计与实现
3.1Lex⁃Yacc
Lex是检测字符匹配性的词法生成程序,Yacc是测定语法的生成程序。一个Lex程序由三段组成:首先是C和Lex定义;第二段是C代码;第三段是C函数。一个Yacc程序也是由三段组成,分别是声明、语法规则和C代码。Lex同Yacc的工作原理如图1所示。
3.2Lex⁃Yacc之间的联系
Lex程序用来计算数字字符串,能对各种符号进行识别,当插码时可以以注释的形式插入插桩代码,等程序完成,可以自行取消代码插桩,不影响整体进程。Yylval用来传递Lex与Yacc之间数字字符串转化后的数值,利用lineno传递正在处理的代码行号和标号。本次设计全程在Linux下,通过Lex编译后生成词法分析程序的C代码,通过Yacc编译后生成语法分析程序的C程序代码。两者通过gcc命令进行编译形成综合分析。最后运行该综合分析器就可以对51系列的汇编语言进行分析[4⁃5]。
3.3被测源程序静态结构分析
Lex⁃Yacc工具对单文件逐行扫描,得出当前语句各类参数类型,不同参数类型分别进入不同的单链表中。其中除了顺序单链表外,其他四种处理方式基本相同。待词法、语法分析完毕,五个单链表中存储了对应的汇编程序。因为单链表本身只是一个转换器,无法显示汇编程序之间的逻辑关系,所以需要对程序进行二次分析,确定所有逻辑关系。其中五个单链表形成的流程图如图2所示。针对程序流程图的建立,首先搜索匹配节点,根据节点不同进入相应分支处理。当前语句在顺序节点,则进入顺序处理模块。从关键字“结束行号+1”开始遍历单链表,存在两种结果:一是算法出错;另外一种就是在主程序中时则表明当前分支分析完成。接着要判断条件跟踪链表中的顺序分支(规定为右分支)是否都已分析完毕。
4覆盖率分析及评测
4.1被测源程序覆盖率分析
虚拟插桩技术就是在汇编语言基本结构的特点上,在源程序的插桩点处设置断点,在源程序执行到断点处,响应断点处指令,给出具体的PC地址,自动记录并打印出来,接连下去形成PC值的数据链。通过查询五类单链表与之建立对应关系,就可以获得到源程序的真实运行轨迹,进而计算出各类覆盖指标。
4.2基于代码的覆盖评测
在仿真测试平台原型系统上,基于代码的覆盖测试首先需要选定适合用作黑盒测试的子过程模块。提取的子过程模块必须具备独立运行的能力,根据覆盖测试的标准和要求对代码逻辑结构进行认真分析,设计出多个测试用例,然后通过手工运行该子程序的方式,在某一特定测试用例驱动下运行,测定出运行路径,通过计算得出两种覆盖率理论评测指标,与仿真测试平台上实现的两种覆盖率相对比,得出覆盖率分析法与虚拟插桩的正确性验证结果。
5嵌入式系统平台设计
设计一个可以代替人工进行黑盒测试的平台系统,见图3,其基本原理是通过脚本语言记录状态信息,之后通过PC回放测试信息以判断结果是否与记录脚本一致,以此决定本次测试是否通过。为此,在编辑源代码时就需要满足录制脚本和脚本回放两个阶段的需求。
5.1插装代码分析
在PC上运行插装系统最重要的原则就是要保证软件原有功能的稳定性和完整性。因此在设计嵌入式系统的插装代码时不能改变程序的原有逻辑和原有执行流程,应尽量降低在嵌入式系统所占的资源,尽可能将部分功能和操作交付于PC进行。嵌入式系统中的模拟用户输入模块的主要功能是将计算机发送的命令进行分析,并将结果回复到处理模块中,其操作模拟流程见图4。
5.2系统状态的定义和获取
(1)声音信息的获取嵌入式系统中对声音信息的获取主要是通过识别每个声音惟一的ID编号和固定的音频编码进行的。工作时,由系统中的服务函数获得ID声音的音频编码并发送到PC中。(2)获取LED信息LED的运行方法和声音相似,都有一套惟一的LED编码,并由LED控制器控制。常用的设计方法是将LED中的编码放到嵌入式系统中的缓冲区内,通过定时刷新函数提取LED信息[6]。(3)获取LCD信息由于LCD需要显示的信息较多,且各消息属性复杂,因此较难提取。目前常用的提取方法是点阵截取法和消息截取法。由于点阵截取法操作简单、测试结果准确率高,因此本文使用点阵截取法获取LCD信息。(4)系统状态的获取主动请求和被动获取是嵌入式系统获取信息的主要方式。主动请求是指嵌入式系统在处理完PC发出的操作命令时,主动将搜集好的信息发送到PC上。被动获取是指嵌入式系统并不主动发送检测信息,而是当状态出现时才决定是否继续后续操作。
5.3自动化比较和测试
软件是否准确输出结果,需要经过多次测试实际输出和预期输出的差别。本文在设计嵌入式系统时综合考虑了一些智能比较思想来优化设计流程。由于实际的嵌入式系统会产生上百个复杂的状态信息[7],为便于比较,本文采用了相对比较的办法对录制脚本时的状态变迁进行比较。最后设计完成的嵌入式系统需对脚本进行测试,这是交互式应用的重要组成部分。脚本测试的准确度主要依赖于所选用的测试工作和脚本技术。当前主要的脚本技术有共享脚本、数据驱动脚本、结构化脚本等。这些脚本都包括了三个命令,即人工操作命令、状态检查命令、逻辑控制命令。测试脚本主要就是对这三个命令进行检查,其中在自动化检测中采用何种脚本记录测试结果可依据模块要求进行选定。
6结语
黑盒测试技术的汇编语言测试系统用例研究在我国已经很多,本文最大的亮点是引入虚拟插桩技术,实现真正插桩,即在被测源程序的插桩点处设置中断指令,当源程序运行到该点处时自动运行断点指令,给出具体的PC地址,进而给出一系列地址数据,根据事先设定的用例判定运行效果,得出黑盒测试的正确验证结果。此方法最大的优点在于高效、精确、成本较低,在实际运用中具有较高的实用价值。
参考文献
[1]孙昌爱,靳若明,刘超,等.实时嵌入式软件的测试技术[J].小型微型计算机系统,2000,21(9):920⁃924.
[2]杜晓东.面向嵌入式系统的测试工具研究[D].成都:电子科技大学,2003.
[3]苏铭,宋宗宇,王华.多计算机的自动插桩与监测系统[J].计算机工程与应用,2002(4):79⁃82.
[4]杨作梅,张旭东.1ex与yacc[M].北京:电子工业出版社,2003.
[5]邓支益,何亦征,田翼.嵌入式软件测试研究[J].航空电子技术,2003,34(1):37⁃42.
[6]曹文静,宫云战.软件测试性计算方法研究[J].计算机工程与设计,2003,24(10):67⁃70.
[7]魏光新,苏丽.逻辑覆盖测试工具的设计与实现[J].计算机工程与应用,2000(5):106⁃109.
作者:何丹丹 单位:大连海事大学