嵌入式软件的覆盖测试(2)

发表于:2011-10-21来源:未知作者:领测软件测试网采编点击数: 标签:
在目标机方,插装过的被测应用程序将覆盖信息发送到消息队列中,一个专门的任务负责在适当的时候将这些信息发送到宿主机方。缩主机方有专门的模块

  在目标机方,插装过的被测应用程序将覆盖信息发送到消息队列中,一个专门的任务负责在适当的时候将这些信息发送到宿主机方。缩主机方有专门的模块负责接收覆盖信息。并交给分析工具分析和在线动态显示覆盖率的增长情况。

  支持嵌入式软件覆盖测试的工具应解决如下2方面的关键问题:

  1)与嵌入式操作系统的结合

  覆盖测试工具与嵌入式操作系统的结合体现在3方面。首先,在目标机方,应用任务与专门负责收集/上传覆盖信息的任务是通过消息队列来传递数据的,该消息队列可使用嵌入式操作系统的相应机制实现。其次,这个专门任务也可以被看作一个特殊的应用任务,也必须有嵌入式操作系统的支持,因为任务管理是后者的基本功能之一。最后,目标机与宿主机之间的通信可以采用串口或以太网方式,对串口的驱动或网络协议均可使用嵌入式操作系统的相应程序组件。

  2)与其它嵌入式交叉开发工具的关系

  嵌入式应用程序的开发通常采用交叉开发方式,几乎所有的开发工具均要解决3部分的问题:宿主机部分的功能、目标机部分的功能、宿主机与目标机的连接问题。其中,宿主机与目标机的连接是个瓶颈,如果不同的工具要使用同一物理线路实现数据传输,则要解决对该物理线路(或者说硬件端口)的正确共享。比如在图3所示的环境中,宿主机方的各种工具通过统一的接口——目标服务器(target server)实现对通信线路的访问,目标机方的调试代理(debug agent)则是各种信息(调试信息、覆盖信息、时间信息、对象信息等)的收集与传递的核心。

  5 Logiscope在嵌入式操作系统DeltaCORE测试中的应用

  Logiscope是Verilog公司的CASE产品,对软件的编码、测试、维护提供多方面的服务,并且支持嵌入式软件的覆盖测试。

  5.1 测试前的准备

  测试前的准备即为支持对DeltaCORE的测试所做的移植工作。

  目前,Logiscope已经为一些成熟的商用嵌入式操作系统提供了支持,比如pSOS。DeltaCORE是我国自主开发的嵌入式强实时操作系统内核,为了利用Logiscope实现对DeltaCORE的应用程序乃至DeltaCORE本身的测试,我们主要解决了第4节中描述的第1个关键问题。

  为了支持嵌入式程序的测试,Logiscope提供了运行在目标机方的程序代码(或称为目标机端的支持库),里面包含了:

  1)1个用来收集和发送覆盖信息的主循环线程,该线程即是嵌入式应用中的特殊任务;

  2)实现具体数据传输的函数,包括对串口或网络的驱动,它们将被上述线程调用;

  3)插装函数的实现,这些函数被被测代码调用,向缓冲中放入覆盖消息块;

  4)对缓冲信息队列的管理;

  5)初始化代码。

  例如,当被测程序运行进入到一条if(……)语句时,整个过程如图4所示。

  为了支持对DeltaCORE的测试,将与这些机制相关的代码进行移植,包括以下几方面:

  1)将收集和发送覆盖信息的主循环线程作为在目标机端运行的应用程序中的特殊任务;

  2)对串口的驱动采用LambdaTOOL BSP(板级支持包)中的串口驱动代替,对网络的驱动,用DeltaCORE的配套组件DeltaNET中的驱动程序实现;

  3)利用DeltaCORE的信箱机制实现消息队列的创建和管理,插装代码向这些信箱发送覆盖消息块;

  4)在DetaCORE应用程序的根任务中调用Logiscope的初始化函数,达到创建特殊任务信箱的目的。

  开发DeltaCORE应用程序时,我们使用了其配套开发工具LambdaTOOL。由于所使用的工具版本没有实现目标服务器(target server)的调试方式,因此对物理端口的使用采用的独占方式,即调试工具不能与其它工具共享同一端口。我们可以用网络试上载并启动目标应用程序,而通过串口传送覆盖信息。

  5.2 对DeltaCORE的覆盖测试过程及结果

  对于函数内部,Logiscope支持的覆盖策略有:

  1)指令块IBs(Instruction Blocks)

  2)判断到判断的路径DDPs(Decision-to-Decision Paths)

  3)MCDC(Modified Condition/Decision)

  在项目层次上支持的覆盖策略是:

  1)过程到过程路径PPP(Procedure-to-Procedure Path)

  在DeltaCORE的测试中,我们采用了较为常用的覆盖策略——判断到判断的路径,其含义是:DDP是一个指令序列,它的起点是函数或判断(if,while,……)的入口点,它的出口是下一个函数或判断的退出点,之间不能再有判断,比如在图5中包含了5个DDPs:

  测试的具体过程是:

  ①利用插装分析器对DeltaCORE的源代码进行插装,并生成插装信息文件。

  ②将移植后的Logiscope目标机端程序与插装后的内核源代码一同编译链接成库,以替代原来的内核库,供应用程序使用。

  ③编写测试案例,从实现应用的角度使用DeltaCORE的各种系统功能调用,力求遍历内核函数所有的判定分支,并将这些案例编译成可执行程序。

  ④在宿主机端启动覆盖信息收集和分析程序,用LambdaTOOL的调试器下载并启动应用程序。DeltaCORE的覆盖信息被传递到宿主机上,分析程序动态显示覆盖率的增长情况,并将这些信息记录在一个文件中。

  ⑤应用程序执行完毕后,启动Logiscope的事后分析工具,将覆盖信息记录文件与插装信息文件(在源代码插装在生成的附属文件)进行比较,帮助测试人员清晰地了解每个被测函数内部的路径覆盖情况,借此可为测试案例的改进提供帮助。

  ⑥测试人员修改测试案例,并重新进行整个测试过程;各项测试的结果可以叠加,覆盖率将得到增长。

原文转自:http://www.ltesting.net