首页 文学文摘 时政新闻 科技科普 经济法律 健康生活 管理财经 教育教学 文化艺术 社科历史

测试用例自动生成方法研究与实现

作者:肖 瑜 来源:现代电子技术


  摘 要:测试用例的生成工作是指选定被测任务、分析输入数据、确定其取值、并分析对应的输出数据。软件测试数据生成在软件系统开发费用中占很大比重,如果该过程能自动实现,则会极大地减少软件开发的周期和费用。介绍一种测试用例自动生成的链方法,这种测试技术,结合插装技术及目标跟踪方法,能有效生成测试用例,从而提高了测试效率。
  关键词:测试用例;链;目标搜索;测试数据
  中图分类号:TP311 文献标识码:B 文章编号:1004373X(2008)1610003
  
  Research and Realization of the Method for Testing Examples Automatic Building
  XIAO Yu
  (Xi′an Military Academy,Xi′an,710108,China)
  
  Abstract:The task,making of testing examples,is a process that choosing task,analysing input date,making sure numerical value rang and analysing output date.Software testing occupied a good many expenses in exploitation of software system.If the process can be realized automatically,the expenses will be decreased and the periods will be shortened.This paper introduces a chain method of testing examples automatic building.The test technique,which combines the inserting technique and the object tracking method,may effectually create testing examples effectively and thus improve testing efficiency.
  Keywords:testing examples;chain;object searching;test data
  
  测试用例的生成工作是指选定被测任务,分析输入数据,确定其取值,并分析对应的输出数据。这是决定测试是否成功的关键环节。目前最完善的工具也不能自动生成测试用例,而是采用人工选取的方法。测试用例选取的一个总的原则就是以尽可能少的测试用例发现尽可能多的错误。目前已有许多实用的技术帮助人们选择测试用例,如边值分析、等价类划分、域测试等。
  软件测试数据生成在软件系统开发费用中占很大比重。如果该过程能自动实现,则会极大地减少软件开发的周期和费用。这里介绍一种链方法,它利用数据的相关性分析来指导测试数据的生成,因而能更有效地生成测试数据。
  
  1 生成测试数据的方法
  
  在初始化测试数据之后,程序员面临的问题是找到额外的测试数据测定没有被覆盖的程序元素,如何找到合适的数据测试那些语句(还称为节点)需要程序员有丰富的编程经验,往往需要花费很多时间,从而增加了软件开发的整体开销。这是因为在软件维护中,程序员并不总是处理自己编写的代码,经常需要修改其他人的程序,往往只能理解一部分,这给维护工作带来一定的困难。而利用测试数据生成器能帮助程序员生成输入数据来测定语句。它主要采用2种方法,即面向路径和面向目标。
  1.1 面向路径
  面向路径指的是选择程序路径,然后生成该路径的输入数据。要测试的路径可以自动生成,也可以由用户提供。现有的面向路径的测试数据生成器有一些不足之处,这些不足之处与选择路径的过程有关。不知道选定路径是否可行,使得面向路径的方法在使用上受到限制,也就是说常会选定一些不可执行的路径,对这些路径的分析计算成果往往都被浪费掉了。
  1.2 面向目标
  面向目标是指评定目标语句(或节点)的过程与所选取的路径无关。它的一般方法是只考虑“必要”的分支(它影响目标节点的执行),忽略“不必要”的分支(它对目标节点的执行毫无影响)。该方法克服了面向路径方法的局限性,完全基于程序的控制流图。经实验证明,该方法与以往的方法相比,能更有效地生成测试数据。
  
  2 目标搜索的实现
  
  本系统的研制就是基于程序的控制流图,采用面向目标的方法,并利用动态调试工具,从而有效地生成测试数据。它的基本思想是在目标节点执行之前先执行一系列“必要”的节点。如果目标节点没有执行,可以根据逆向推理进一步查找原因。这里定义一种探测器结构,以记录程序的执行路线。此外,还定义了一种链式存储结构——双向邻接表,它将传统的邻接表和逆邻接表结合起来,在表结点和头结点中分别加上指向前一条弧的指针,以及指向第一条指向该顶点的弧的指针,以便于逆向推理的实现。
  2.1 探测器技术
  探测器结构如下所示:
  mov ax,linenum
  mov bx,2
  mul bx
  lea di,msg
  add di,ax
  mov ah,31h
  mov[di+1],ah
  为记录程序的执行路线,只要跟踪跳转语句的执行情况即可,因此,在每一个跳转语句之后插入一个探测器,就可以很好地记录程序的语句覆盖情况。首先,建立一个记录文件,初始文件中各位数据均为0,其中,相邻的两位分别代表跳转语句的左右2个分支。执行插入探测器的程序之后,会将记录文件中相应位上的0改写为1。通过判断文件中1的位置来确定对应的行号,并在源文件中相应的行上作出标记。在记录文件中可出现4种组合情况:00,01,10,1l。在源程序中对应的行上分别标记为:none,left,right及double,分别表示没有执行跳转语句、执行了左分支、右分支以及双向分支。
  2.2 插装技术
  分支插装技术记录的是“遍历”程序分支的情况。在8086/8088中的转移指令分为条件转移指令和非条件转移指令(这里只考虑条件转移指令)。以下面的源程序段中的jz labl指令为例说明分支覆盖测试的实现。
  Sub:…
  jc lab1
  lab: mov al,01
  jz lab1
  add bx,ax
  lab1: add bx,ax
  test al,03
  如果在jz labl与add bx,ax之间插入探测器,在labl标号与add dx,ax之间插入另一个探测器,并不能准确记录jz lab1这条转移指令产生的2条分支的执行情况。本系统采用将条件转移指令略加变换的方法来完成。变换的方法是生成2个临时标号,如11与12,将jz labl转化为如图1所示的形式。
  从功能上讲,它与原来的程序是等价的。转化后的程序中要想记录jz labl产生分支的执行情况就很容易了。可在11与jmpl2之间插入一个探测器,在11与jmp labl之间放入另一个探测器,这样就能正确记录程序分支的执行情况。其中代表探测器。
  
  2.3 双向邻接表
  表结点和头结点结构如下所示:
  
  程序流图的双向邻接表存储结构说明如下:
  #define MAX_VERTEX_NUM 20
  Typedef struct ArcNode
  {
  int arjvex;//该弧所指向的顶点的位置
  struct ArcNode *nextarc; //指向下一条弧的指针
  struct ArcNode *priarc; //指向前一条弧的指针
  InfoType *info;//与该弧相关的信息
  }Arcnode;
  Typedef struct Vnode
  {
  VertexType data; //顶点信息
  ArcNode *firstoutarc; //指向第一条依附该顶点的弧的指针
  ArcNode *firstinarc; //指向第一条指向该顶点的弧的指针
  }Vnode,AdjList[MAX_VERTEX_NUM];
  以下面程序段为例进行说明。该程序段的流程图如图2所示。其双向邻接表如图3所示。
  
  …
  cmp ax,[si+4];25
  jnc fmax2;26
  mov ax,[si+4];27
  fmax2:movflag,2;28
  movmax,ax;29
  
  3 目标搜索
  
  输入目标节点之后,即可根据记录文件中的信息进行目标搜索,其过程如下:
  (1) 建立双向邻接表(节点的adjvex域为行号);
  (2) 输入目标节点序号;
  (3) 查找目标节点。程序执行之后,在记录文件中将会记录其执行路线。若从该文件中找到目标节点的记录,说明该节点已被执行过,查找成功;若没有找到,则沿其后向指针找到其父亲节点,再查找父亲节点的执行情况。若没有执行过,则继续查找,否则,说明目标节点的执行与此节点有关,可进一步判断出该语句是一个跳转语句。若改变该节点的执行条件,则一定会改变分支走向。
  因此,通过更换一组测试用例的方法可以改变该点的执行流。如果无法找到合适的测试用例,可利用动态调试工具(TuboDebug)中的数据修改功能修改寄存器中的值,从而改变该点的执行流。改变后的程序执行后,在记录文件中会生成新的执行记录。根据新的记录文件再次进行统计,并建立新的文件标记。重复上述操作,直到找到目标节点或其后向节点为空为止。若其后向节点为空,则说明此目标节点是不可达的。
  
  4 结 语
  
  基于程序的控制流图,通过双向邻接表链式存储结构的定义及实现,插装技术的应用,以及目标跟踪方法的采用,能有效地生成测试数据,从而进一步推进了软件测试技术的自动实现。
  
  参 考 文 献
  [1]郑人杰.软件测试技术\.北京:清华大学出版社,1992.
  [2]\莫斯里.软件测试自动化\.邓波,黄丽娟,曹青春,等译.北京:机械工业出版社,2003.
  [3]Doong R K,Frankl P G.The ASTOOT Approach to Testing Objectoriented Programs\.ACM Transactionson Software Engineering and Methodology,1994,13(2):101130.
  [4]夏辉,宋昕,王理.基于Z路径覆盖的测试用例自动生成技术研究\.现代电子技术,2006,29(6):9294.
  [5]胡滨.软件自动测试工具的研究\.现代电子技术,2007,30(18):9799.
  
  作者简介 肖 瑜 男,1964年出生,新疆伊犁人,教授。研究方向计算机仿真与模拟。