嵌入式软件语句覆盖率测试插桩技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
K ey word s: embedded softw are; host based env ironm ent; code instrum entation; statem ent coverag e; un it test; em ulating and testing
0 引言
随着嵌入式设备 在越来越 多的领 域中得 到使用, 如何 对 日益复杂的嵌入式软 件进行快速有效的测试已经成为目前的 一大热点问题。从国 内外现状 来看, 对嵌 入式软件 测试的 研 究, 大多着重 关 注 嵌 入式 软 件 的 调试 工 作, 即 D ebugg ing 阶 段, 而鲜见系统的、全面的测试 技术探讨。随着嵌入式软件质 量保证要求的提高, 对嵌入 式软件 的测试 显然已 经不能 停留 于仅仅通过调试就可以了, 必然需要有更加全面的、系统化的 测试技术支持 [ 1]。传统的嵌 入式软 件测试 一般采用 手工的、 插桩目标代码的方 式。由于目 标代码 中语法、语义 信息不 完 整, 有时会造成对错误的分析定位不够准确; 采用手工的方式 进行, 效率低、效果差, 存在 漏洞和 隐患 [ 2] 。同时 由于嵌 入式 软件需要采用交叉开 发的方 式, 嵌 入式软 件测试 也存在 同样 的问题, 而语句覆盖率测试是软件测试最基本的方法, 因此在 开发初期, 实现在没有目标 机的环 境下自 动完成 对嵌入 式软 件的语句覆盖测试是 非常必要的。
关键词: 嵌入式软件; 宿主机环境; 程序插桩; 语句覆盖; 单元测试; 仿真测试 中图分类号: T P311. 56 文献标志码: A
Instrum entation technology for embedded softw are statem ent coverage testing
SUN H ong li, WANG Zhong m in, WANG W en lang
收稿日期: 2010- 03- 31; 修回日期: 2010- 05- 26。 基金项目: 陕西省自然科学基础研究计划项目 ( SJ08 ZT14) ; 西安市科技计划项目 ( CXY 08017 ( 1) ) 。 作者简介: 孙红利 ( 1984- ) , 女, 陕西延安人, 硕士研究生, 主要研究 方向: 嵌入式 系统、嵌入 式软件测 试; 王忠民 ( 1967- ), 男, 陕西蒲 城 人, 教授, 博士, CCF会员, 主要研究方向: 嵌入式系统、智能机器人; 王文浪 ( 1964- ) , 男, 陕西渭南人, 高级实验师, 主要研究方向: 嵌入式 软件 测试。
( S chool of Com pu ter S cien ce and Techn ology, X i an Universi ty of P osts and T elecomm unication s, X i an S haanxi 710061, C hina)
Abstract: F or the host based embedded so ftware testing, a genera lm ethod fo r statem ent coverage testing in the unit test was proposed. T he m ethod was imp lem ented by piling techno logy be fore comp iling the source code. T he relevant a lgo rithm of the test code, w ith wh ich the piling techno logy would be autom atically perform ed, w as designed. A nd these approaches w ere eventually applied to the p la tform ARM test for embedded softw are emu la ting and testing. By these approaches, the prob lem s in the early em bedded so ftwa re development can be found and improved through the ho st based env ironm en t and simu la tion env ironm en t.
第 30卷第 10期 2010年 10月
计算机应用 Journal o f Computer A pp lications
V o .l 30 N o. 10 O ct. 2010
文章编号: 1001- 9081( 2010) 10- 2738- 03
嵌入式软件语句覆盖率测试插桩技术
孙红利, 王忠民, 王文浪
点; 由于 源代码中包括全部 的语法、语义 信息, 对源代 码的 分 析能够达到最高的准确度。
1 嵌入式软件测试插桩原理规则
利用嵌入式软件仿真测试环境对嵌入式软件进 行测试是 目前国内外公认的一种有效的测试方法。本文针对嵌入式 软 件, 提出 了一种基于宿主机的测试模型, 如图 1所示。
图 1 基于宿主机的嵌入式软件测试模型 在实际应用中, 嵌入式软 件的运行 离不开 具体的 外围 设 备。因此, 在宿主 机环境下, 还必须对已有的外设以及即将 出 现的外设进行仿真。利用软件模拟中断机制, 实现 ARM 内核 与模拟外设之间的数据 交互共 享, 将 每个外 设对应 建立的 共
1)在第一个函数体之前插入一些初始化语句及 桩函数; 2) for、do、do wh ile、do until等循环语句处; 3) if、else if、e lse及 end if等条件语句各分支处; 4)输入输出语句之前; 5)函数调用语句之前; 6) return语句之前; 7) goto 语句之前。 1. 2. 2 桩函数的设计 插桩操作插入的 桩函数首先要是由与被测试程序相同的
语言编写而成的, 满足源代码函数的语法规则, 并且是能够 编 译通过的。另外, 在设计桩函数时, 要考虑的一个重要问题 就 是经过插桩操作, 要获得程 序执行 过程中 的哪些 信息。其 中 测试类型不同所设计的桩函数也可能不同。本文所设计的 桩 函数 stub( ) 是专门针对单元测 试的语 句覆盖 率测试的 , 通 过 所设计的桩函数可以采集到所执行行的行号和本行 所执行的 次数以及代码执行过程 中的覆 盖率情 况, 在 必要时 也可以 统 计出行执行的时间。在第 3章算法描述中对桩函数做了具 体 的描述。 1. 2. 3 插桩位置的确定
在程序插桩中除了要考虑插桩规则中所述的前 两个问题
外, 插桩 位置的确定也是一 个至关 重要的 问题。通常 针对 不 同的语句格式插桩位置 会有所 不同, 所有的 插桩位 置选择 都 必须建立在确保ቤተ መጻሕፍቲ ባይዱ桩后的程序可以正确运行的基础 上。
2 算法设计
针对基于宿主机的嵌 入式软 件测试, 单元 测试中 的语 句 覆盖率测试算法描述如下。
本文在对现 有的 测试 方法 和插 桩技 术的 总结 分 析基 础 上, 改进了传统的测试方式, 采用向源代 码插桩的插桩方式提 出了一种通用的嵌入 式软件 语句覆 盖率测试 方法, 实现 在没 有目标机的环 境下 通过 测试 代码 自动 完成 对嵌 入式 软件 高 效、准 确的 测试, 克 服了 传统 手工 测试 效率 低、效果 差的 缺
步骤 1 构造初始 化函 数 In it( )及 桩 函数 Stub( ), 为 后 面向被测试程序插桩做准备。
S tub 函数体中包含下列的语句: L ineN um = ch aL ine; ExeT im e[ chaL ine]++ ; L ine[ chaLin e] = L in eN um << 16 |ExeT im e[ chaLin e]; 相当于一个计数器的功能, 当程序每执行到一处时, 该 点 的执行次数将会加 1。 Init( )中包 含对 L ineNum、chaL ine、ExeT ime [ ] 等 Stub( ) 函数体中出现变量的初 始化, 以保证 插桩后 的文件 可以正 确 运行。其中的数组 L ine [ ]是 由一 个整 型数 和一 个整 型数 组 合并而成的, L ineN um 表示 执行 到行的 行号, Ex eT im e [ ] 存 放 该行的执行次数。 此处的初始化语句和桩函数在插桩过程中都要 被插入被 测试程序中。 步骤 2 打开被测程序, 对被 测程序进行 初次扫描 , 在 扫 描过 程 中 按 行 读 取 源 程 序, 统 计 被 测 试 程 序 的 总 行 数 Z lineN um 及被测试程 序中 所有 函数 名 的个 数 fuc, 并且 找 到 m ain函数体及其 下一个函数体中函数 名出现 的位置, 将其 分 别记为 Lm ain和 LNm a in, 为后面向 m a in函数体插桩做准备。 在读 取 过 程 中用 语 句 ZL ineN um + + !记 录 总行 数; 用 Lm ain = ZL ineN um; ! 和 LNm a in = ZL ineNum; ! 分 别 记 录 m ain函数体及其 下一个函数体中函数 名具体 所在行的 行号, 下面的语句则实现 m a in函数体中函数名具体位置的记录。 fgets( bu,f 1024, fp ); ZL ineN um ++ ; if ( ( index( "( ", buf)! = - 1)&& ( id entf( buf) )&&
在整个测试实现 过程中向源程序的插桩处于至关重要的 地位, 下面就本文所用的插桩原理与规则做详细说明。 1. 1 程序插桩的思想
程序插桩是借助 向被测程序中插入操作来实现测试目的 的方法, 是软件白盒测试中 的一种 基本的 测试手 段 [ 3]。 通过 插桩, 可以进一步 了 解程 序执 行过 程中 的一 些动 态特 性 [ 4]。 本系统采用的插桩技 术在动态测试之前根据测试人员所选的 测试方式选择不同的 插桩程 序完成 对源程序 的自动 插桩, 插 入已经设计好的桩函 数, 在 动态测 试阶段 通过运 行插桩 后的 程序可以获得所需要的程序运 行信息。例如在单元测试的语 句覆盖率测试中通过 运行插桩后程序可以获得可执行语句中 所执行到行的行号及该行的执 行情况。本文所述的插桩技术 支持如下的覆盖率测 试信息 [ 5]:
第 10期
孙 红利等: 嵌入式软件语句覆盖率测试插桩技术
2 73 9
享内存作为数据的中 转站, 其交互机制如图 1所示。至此, 就 建立了一个完整的 仿真平 台。对该平 台进行 完善, 添加各 种 测试类型, 最终实现一个适合于嵌入式软件的仿真测试环境。
通过仿真测试环 境实现在只有宿主机环境的情况下完成 对嵌入式软件全面、有效的测试, 解决了 在测试过程中由于宿 主机和目标机的交联使用所出 现的数据信息传输问题。在测 试实现过程中, 首先对被测代码进行插桩, 运行插桩后文件获 得的桩信息经过桩信 息分析 器可计 算出覆盖 率, 并最终 通过 仿真平台完成流水灯 等外设的模拟工作。
( 西安邮电学院 计算机学院, 西安 710061 ) ( sunhongl.i app le@ 163. com )
摘 要: 针对基于宿主机的嵌入式软件测试, 提出一种单元测试中通用的语句覆盖率测试方法, 通过插桩技术, 采用 向源代码插桩实现语句覆盖率测试。设计了测试代码的实现 算法, 通过测试代码可以自动完成向被测代码插 桩。这些 方法被成功地应用到笔者所在项目组开发的嵌入式软件仿真测试平台 ARM test上。利用这些方法, 在嵌入式硬件系统 未完成开发之前, 可通过宿主机环境和仿真环境及时发现嵌入式软件开发初期的一些不足并加以完善。
语句覆盖率 = 运 行的语句数 /总的可执行语句数 1 00%
具体的插桩实现 如图 2所示。
图 2 插桩实现流程 1. 2 程序插桩的规则 1. 2. 1 插桩点的选择
插桩是通过在所选的插桩 点插入桩函数实现的。其中插 桩点的选择是插桩 技术必 须考虑 的关键 问题。一般 情况下, 插桩点位置的选择应 该满足在能够充分采集到所需信息的情 况下使得代码的膨 胀率最 小, 对 程序的 影响最 小。本文所 述 测试方法, 在被测程序所有的可执行语句中选择插桩点, 对于 一些声明语句及左右大括号等 都不进行插桩。由于插桩是在 保持源程序逻辑完整 性和可 执行性 的情况下 进行, 所以 实际 测试过程通常在下面 一些部位插桩:
0 引言
随着嵌入式设备 在越来越 多的领 域中得 到使用, 如何 对 日益复杂的嵌入式软 件进行快速有效的测试已经成为目前的 一大热点问题。从国 内外现状 来看, 对嵌 入式软件 测试的 研 究, 大多着重 关 注 嵌 入式 软 件 的 调试 工 作, 即 D ebugg ing 阶 段, 而鲜见系统的、全面的测试 技术探讨。随着嵌入式软件质 量保证要求的提高, 对嵌入 式软件 的测试 显然已 经不能 停留 于仅仅通过调试就可以了, 必然需要有更加全面的、系统化的 测试技术支持 [ 1]。传统的嵌 入式软 件测试 一般采用 手工的、 插桩目标代码的方 式。由于目 标代码 中语法、语义 信息不 完 整, 有时会造成对错误的分析定位不够准确; 采用手工的方式 进行, 效率低、效果差, 存在 漏洞和 隐患 [ 2] 。同时 由于嵌 入式 软件需要采用交叉开 发的方 式, 嵌 入式软 件测试 也存在 同样 的问题, 而语句覆盖率测试是软件测试最基本的方法, 因此在 开发初期, 实现在没有目标 机的环 境下自 动完成 对嵌入 式软 件的语句覆盖测试是 非常必要的。
关键词: 嵌入式软件; 宿主机环境; 程序插桩; 语句覆盖; 单元测试; 仿真测试 中图分类号: T P311. 56 文献标志码: A
Instrum entation technology for embedded softw are statem ent coverage testing
SUN H ong li, WANG Zhong m in, WANG W en lang
收稿日期: 2010- 03- 31; 修回日期: 2010- 05- 26。 基金项目: 陕西省自然科学基础研究计划项目 ( SJ08 ZT14) ; 西安市科技计划项目 ( CXY 08017 ( 1) ) 。 作者简介: 孙红利 ( 1984- ) , 女, 陕西延安人, 硕士研究生, 主要研究 方向: 嵌入式 系统、嵌入 式软件测 试; 王忠民 ( 1967- ), 男, 陕西蒲 城 人, 教授, 博士, CCF会员, 主要研究方向: 嵌入式系统、智能机器人; 王文浪 ( 1964- ) , 男, 陕西渭南人, 高级实验师, 主要研究方向: 嵌入式 软件 测试。
( S chool of Com pu ter S cien ce and Techn ology, X i an Universi ty of P osts and T elecomm unication s, X i an S haanxi 710061, C hina)
Abstract: F or the host based embedded so ftware testing, a genera lm ethod fo r statem ent coverage testing in the unit test was proposed. T he m ethod was imp lem ented by piling techno logy be fore comp iling the source code. T he relevant a lgo rithm of the test code, w ith wh ich the piling techno logy would be autom atically perform ed, w as designed. A nd these approaches w ere eventually applied to the p la tform ARM test for embedded softw are emu la ting and testing. By these approaches, the prob lem s in the early em bedded so ftwa re development can be found and improved through the ho st based env ironm en t and simu la tion env ironm en t.
第 30卷第 10期 2010年 10月
计算机应用 Journal o f Computer A pp lications
V o .l 30 N o. 10 O ct. 2010
文章编号: 1001- 9081( 2010) 10- 2738- 03
嵌入式软件语句覆盖率测试插桩技术
孙红利, 王忠民, 王文浪
点; 由于 源代码中包括全部 的语法、语义 信息, 对源代 码的 分 析能够达到最高的准确度。
1 嵌入式软件测试插桩原理规则
利用嵌入式软件仿真测试环境对嵌入式软件进 行测试是 目前国内外公认的一种有效的测试方法。本文针对嵌入式 软 件, 提出 了一种基于宿主机的测试模型, 如图 1所示。
图 1 基于宿主机的嵌入式软件测试模型 在实际应用中, 嵌入式软 件的运行 离不开 具体的 外围 设 备。因此, 在宿主 机环境下, 还必须对已有的外设以及即将 出 现的外设进行仿真。利用软件模拟中断机制, 实现 ARM 内核 与模拟外设之间的数据 交互共 享, 将 每个外 设对应 建立的 共
1)在第一个函数体之前插入一些初始化语句及 桩函数; 2) for、do、do wh ile、do until等循环语句处; 3) if、else if、e lse及 end if等条件语句各分支处; 4)输入输出语句之前; 5)函数调用语句之前; 6) return语句之前; 7) goto 语句之前。 1. 2. 2 桩函数的设计 插桩操作插入的 桩函数首先要是由与被测试程序相同的
语言编写而成的, 满足源代码函数的语法规则, 并且是能够 编 译通过的。另外, 在设计桩函数时, 要考虑的一个重要问题 就 是经过插桩操作, 要获得程 序执行 过程中 的哪些 信息。其 中 测试类型不同所设计的桩函数也可能不同。本文所设计的 桩 函数 stub( ) 是专门针对单元测 试的语 句覆盖 率测试的 , 通 过 所设计的桩函数可以采集到所执行行的行号和本行 所执行的 次数以及代码执行过程 中的覆 盖率情 况, 在 必要时 也可以 统 计出行执行的时间。在第 3章算法描述中对桩函数做了具 体 的描述。 1. 2. 3 插桩位置的确定
在程序插桩中除了要考虑插桩规则中所述的前 两个问题
外, 插桩 位置的确定也是一 个至关 重要的 问题。通常 针对 不 同的语句格式插桩位置 会有所 不同, 所有的 插桩位 置选择 都 必须建立在确保ቤተ መጻሕፍቲ ባይዱ桩后的程序可以正确运行的基础 上。
2 算法设计
针对基于宿主机的嵌 入式软 件测试, 单元 测试中 的语 句 覆盖率测试算法描述如下。
本文在对现 有的 测试 方法 和插 桩技 术的 总结 分 析基 础 上, 改进了传统的测试方式, 采用向源代 码插桩的插桩方式提 出了一种通用的嵌入 式软件 语句覆 盖率测试 方法, 实现 在没 有目标机的环 境下 通过 测试 代码 自动 完成 对嵌 入式 软件 高 效、准 确的 测试, 克 服了 传统 手工 测试 效率 低、效果 差的 缺
步骤 1 构造初始 化函 数 In it( )及 桩 函数 Stub( ), 为 后 面向被测试程序插桩做准备。
S tub 函数体中包含下列的语句: L ineN um = ch aL ine; ExeT im e[ chaL ine]++ ; L ine[ chaLin e] = L in eN um << 16 |ExeT im e[ chaLin e]; 相当于一个计数器的功能, 当程序每执行到一处时, 该 点 的执行次数将会加 1。 Init( )中包 含对 L ineNum、chaL ine、ExeT ime [ ] 等 Stub( ) 函数体中出现变量的初 始化, 以保证 插桩后 的文件 可以正 确 运行。其中的数组 L ine [ ]是 由一 个整 型数 和一 个整 型数 组 合并而成的, L ineN um 表示 执行 到行的 行号, Ex eT im e [ ] 存 放 该行的执行次数。 此处的初始化语句和桩函数在插桩过程中都要 被插入被 测试程序中。 步骤 2 打开被测程序, 对被 测程序进行 初次扫描 , 在 扫 描过 程 中 按 行 读 取 源 程 序, 统 计 被 测 试 程 序 的 总 行 数 Z lineN um 及被测试程 序中 所有 函数 名 的个 数 fuc, 并且 找 到 m ain函数体及其 下一个函数体中函数 名出现 的位置, 将其 分 别记为 Lm ain和 LNm a in, 为后面向 m a in函数体插桩做准备。 在读 取 过 程 中用 语 句 ZL ineN um + + !记 录 总行 数; 用 Lm ain = ZL ineN um; ! 和 LNm a in = ZL ineNum; ! 分 别 记 录 m ain函数体及其 下一个函数体中函数 名具体 所在行的 行号, 下面的语句则实现 m a in函数体中函数名具体位置的记录。 fgets( bu,f 1024, fp ); ZL ineN um ++ ; if ( ( index( "( ", buf)! = - 1)&& ( id entf( buf) )&&
在整个测试实现 过程中向源程序的插桩处于至关重要的 地位, 下面就本文所用的插桩原理与规则做详细说明。 1. 1 程序插桩的思想
程序插桩是借助 向被测程序中插入操作来实现测试目的 的方法, 是软件白盒测试中 的一种 基本的 测试手 段 [ 3]。 通过 插桩, 可以进一步 了 解程 序执 行过 程中 的一 些动 态特 性 [ 4]。 本系统采用的插桩技 术在动态测试之前根据测试人员所选的 测试方式选择不同的 插桩程 序完成 对源程序 的自动 插桩, 插 入已经设计好的桩函 数, 在 动态测 试阶段 通过运 行插桩 后的 程序可以获得所需要的程序运 行信息。例如在单元测试的语 句覆盖率测试中通过 运行插桩后程序可以获得可执行语句中 所执行到行的行号及该行的执 行情况。本文所述的插桩技术 支持如下的覆盖率测 试信息 [ 5]:
第 10期
孙 红利等: 嵌入式软件语句覆盖率测试插桩技术
2 73 9
享内存作为数据的中 转站, 其交互机制如图 1所示。至此, 就 建立了一个完整的 仿真平 台。对该平 台进行 完善, 添加各 种 测试类型, 最终实现一个适合于嵌入式软件的仿真测试环境。
通过仿真测试环 境实现在只有宿主机环境的情况下完成 对嵌入式软件全面、有效的测试, 解决了 在测试过程中由于宿 主机和目标机的交联使用所出 现的数据信息传输问题。在测 试实现过程中, 首先对被测代码进行插桩, 运行插桩后文件获 得的桩信息经过桩信 息分析 器可计 算出覆盖 率, 并最终 通过 仿真平台完成流水灯 等外设的模拟工作。
( 西安邮电学院 计算机学院, 西安 710061 ) ( sunhongl.i app le@ 163. com )
摘 要: 针对基于宿主机的嵌入式软件测试, 提出一种单元测试中通用的语句覆盖率测试方法, 通过插桩技术, 采用 向源代码插桩实现语句覆盖率测试。设计了测试代码的实现 算法, 通过测试代码可以自动完成向被测代码插 桩。这些 方法被成功地应用到笔者所在项目组开发的嵌入式软件仿真测试平台 ARM test上。利用这些方法, 在嵌入式硬件系统 未完成开发之前, 可通过宿主机环境和仿真环境及时发现嵌入式软件开发初期的一些不足并加以完善。
语句覆盖率 = 运 行的语句数 /总的可执行语句数 1 00%
具体的插桩实现 如图 2所示。
图 2 插桩实现流程 1. 2 程序插桩的规则 1. 2. 1 插桩点的选择
插桩是通过在所选的插桩 点插入桩函数实现的。其中插 桩点的选择是插桩 技术必 须考虑 的关键 问题。一般 情况下, 插桩点位置的选择应 该满足在能够充分采集到所需信息的情 况下使得代码的膨 胀率最 小, 对 程序的 影响最 小。本文所 述 测试方法, 在被测程序所有的可执行语句中选择插桩点, 对于 一些声明语句及左右大括号等 都不进行插桩。由于插桩是在 保持源程序逻辑完整 性和可 执行性 的情况下 进行, 所以 实际 测试过程通常在下面 一些部位插桩: