1.4 静态测试与动态测试

更新于 2026年10月10日 版权声明
1.4 静态测试与动态测试

对程序进行单元测试时,根据是否需要执行被测程序分为动态测试和静态测试。动态测试需要实际执行程序用以收集信息进而生成测试用例,然而动态测试随机选取初值以及执行程序时的不确定性使得程序产生大量迭代,甚至产生溢出。静态测试不实际运行程序,而是通过静态分析和模拟的手段来生成测试用例,开销更小,是测试领域的一个重要分支。

动态测试是由Webb Miller和David L.Spooner在1976年针对浮点型的测试用例生成问题提出的方法。该方法需要反复执行被测程序,并收集程序信息,判断当前特定的测试需求,依据检查运行结果来指导之后的程序分析和用例生成工作。动态测试相比于静态测试具有一定优势,这是因为程序运行时各个输入变量的值就已经确定。然而由于赋值的随机性和试探性的搜索导致的不确定性,动态测试不能保证一定能为存在解的约束集合找到解。

静态测试不实际运行程序,而是通过静态分析和模拟的手段来生成测试用例。这种方法对被测程序语法、结构、接口等结构进行解析后,用符号变量代替实际变量去执行一条程序路径并提取出这条路径上所有需要满足的约束条件,最后通过求解约束满足问题即约束求解器来生成满足这些约束的测试用例。一般来讲,静态分析技术采用“保守的”分析,并且得到的结果也是可靠的。常用的静态分析技术有以下几种。

1.符号分析技术(https://www.daowen.com)

符号分析技术是指用符号变量而不是实际的程序变量去模拟程序的执行过程,即生成用例的过程中并不去实际执行程序。符号分析技术在20世纪70年代被引入程序分析领域[14],其认为赋值语句是符号分析的参数条件,条件语句则是符号值的约束系统。符号执行包括前向替换和后向替换。前向替换更符合程序真实的自顶向下的执行过程,通过判断路径中的谓词从而得到路径上的约束。后向替换则是从程序出口依次向前替换。

符号分析理论主要面向变量间的现行关联问题求解,而不讨论变量间的逻辑关联。符号分析能够精确地分析程序的行为,并在遍历数据流的过程中对所有变量在任何可达路径下的可能取值进行计算,提供保守的分析结果。但是当程序中包含结构体、数组、字符串、库函数等较为复杂的数据结构或约束形式时,为其生成相应的符号是一项比较困难的工作。本书第5章介绍的库函数约束求解模型即可较好地处理包含库函数的约束,为其输入参数生成用例。

2.区间抽象和区间运算

抽象解释是一种程序行为的逼近理论,用于不同抽象级来逼近程序的形式语义[15]。它的主要思想就是把程序的语义计算替换为抽象域的计算,抽象执行的结果能够反映程序的实际运行情况。在程序分析过程中,程序的状态集合是由抽象域中的域元素来近似的,而程序的动作语义(如判断、赋值、循环等)则由抽象域中的域操作进行建模。区间抽象域(interval domain)是对程序中变量的取值范围进行的区间抽象,它忽略了变量之间的关系,认为变量之间是相互独立的,即区间抽象是一种非关联的抽象。区间运算就是用区间集合代替具体数值的数学方法,它可以更加保守地描述变量的可能性取值。区间运算由Burkill和Young提出,Moore将区间运算运用到数值分析领域求解舍入误差。在后来的发展中,区间运算被越来越多地运用到科学计算、工程计算领域。为了提高软件测试精度并保证测试结果是可靠的,区间运算被应用到软件测试领域。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)