测试数据生成的过程就是在输入域中,寻找满足测试准则(如语句覆盖、分支覆盖或路径覆盖)的输入数据的过程。
关于结构测试,有三种测试数据生成方法:随机测试数据生成方法、面向目标的测试数据生成方法以及面向路径的测试数据生成方法。
对于给定的语句(分支或路径),随机测试数据生成方法是在输入域内随机选取测试数据,使得给定语句被执行。
面向目标的测试数据生成方法,依据程序控制流信息,将程序中所有的分支分成两类:一类是影响目标结点的分支,另一类是不影响目标结点的分支。测试数据生成时,根据影响目标结点的那些分支,生成相应的测试数据,使得给定语句被执行。为了能按照预定的分支,走向给定语句,数据依赖分析是必要的。分析数据依赖关系,识别影响给定语句执行的那些语句,即先于给定结点执行的结点序列,再考虑影响目标结点的那些分支,可以提高测试数据生成效率。面向目标的测试数据生成方法,与路径选择无关,虽然可以达到语句覆盖、分支覆盖,但在结构测试覆盖准则中,路径覆盖率是较低的,只有当程序中每一条路径都被测试了,才能说程序得到了全面的检验。
面向路径的测试数据生成方法,首先确定一条经过给定语句的程序路径,这条路径可以自动生成,也可以人为指定。然后在输入域中寻找输入数据,使得在此输入之下,程序沿该路径运行,从而使得给定语句被执行。面向路径的测试数据生成又分为符号执行和实际程序执行两类。符号执行允许程序输入常量、符号值、符号表达式等,以符号计算代替实际执行的数值计算,产生一个符号输入值的代数表达式,即路径约束,它是选定路径的谓词系统。实际上是对输入数据的限制要求,由多个不等式(等式)组成。通过求解不等式,求取满足路径上各限制谓词的测试数据。若系统无解,则相应的路径为不可行路径。与逻辑电路测试类似,软件测试也可以基于故障来产生。用代数约束来描述检测特定类型故障的测试数据。符号执行能够判定路径的可行性,一次符号测试的结果代表了一类普通测试的运行结果,因此测试成本较低。但在遇到循环、过程调用、动态数据结构、数组和指针处理时,符号执行实现困难。基于程序实际执行的测试数据生成方法可以对选定路径上的分支谓词,写出一个逻辑表达式,再进行布尔函数极小化,以确定输入数据,使程序执行沿选定路径进行。也可以利用迭代逼近法,求取满足选定路径上所有谓词的输入值。每次迭代中,执行与选定路径谓词有关的语句,得到一个线性约束集,求解该线性约束集,获得一个输入增量,进而得到下次迭代的输入值,最终产生选定路径的测试数据。也可以用约束求解的方法生成测试数据,将被测程序转化成一个约束系统,然后寻找经过给定语句的路径,生成相应的测试数据。基于程序实际执行的测试数据生成方法,在程序执行的每一步,数组下标、指针值都是确定的。因此,对数组和指针的处理方便,但其测试数据生成与路径选择有关,而判定所选路径是否为可行路径是一件非常困难的事情。
随机测试数据生成、面向目标的测试数据生成和面向路径的测试数据生成方法大多只利用控制流信息生成测试数据。而利用数据流信息生成测试则是另一类测试生成方法。该方法将数据流信息应用到路径选择中,并定义了相应的测试覆盖准则。例如,所有定义引用路径覆盖准则是指在一个变量被定义之后,所有引用该变量的语句都必须被覆盖。而所有定义覆盖准则则要求所有定义变量的语句都必须被覆盖。所有计算引用覆盖准则要求所有计算出来的变量被引用的通路都必须被覆盖。数据流测试已经开发了一些软件测试工具,例如ATAC,能够评估测试集的覆盖率,识别未被覆盖的程序范围等,有利于指导选择测试用例,提高测试覆盖率。但是,无论哪一种结构测试,即使其覆盖率达到百分之百,也不能保证把所有隐藏的程序缺陷都揭露出来。
文章来源于领测软件测试网 https://www.ltesting.net/