软件测试用例自动生成技术(一)

软件测试这一环节在软件开发周期中不可或缺。然而软件测试却花费软件开发超过一半的成本。因此利用软件测试用例自动生成技术来降低软件开发成本并提高软件开发效率就变得至关重要。目前软件测试用例自动生成技术可大体分为五类:
1. 符号执行及程序结构覆盖测试(symbolic execution and program structural coverage testing)
2. 基于模型的测试用例生成技术(model-based test case generation)
3. 混合型测试(combinatorial testing)
4. 自适应型随机测试–随机测试的一个变种(adaptive random testing as a variant of random testing)
5. 基于搜索的测试(search-based testing)
本博文分多博客逐次介绍这些技术。

1. 符号执行(Symbolic Execution)

符号执行是一种程序分析技术。其可以通过分析程序来得到特定代码域执行的输入。使用符号执行分析一个程序时,该程序会使用符号值作为输入,而非一般执行程序时使用的具体值。在达到目标代码时,分析器可以得到相应的路径约束(PC:Path Constraint),然后通过约束求解器来得到触发目标代码的具体值。
From: https://zh.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E6%89%A7%E8%A1%8C

1.1 测试案例

软件测试用例自动生成技术(一)_第1张图片

上图(a)为一段交换x,y值的代码,仅当初始值x>y时交换。上图(b)为该段程序的执行树(Execution Tree,执行树进行符号执行时程序的所有执行路径,其中结点表示程序状态,边表示状态转移,结点右上角编号为程序行编号)。
在执行语句1前PC设值为真因为无论x,y为何值语句1的判断条件总会执行。执行树表示了程序所有可能的执行路径,比如当 XY 时,路径1,8执行;当 X>Y 时执行1,2,3,4,5。
尽管符号执行在中世纪便已提出,但这项技术得到关注才是近年的事。原因有二:
1. 面对现实中庞大的程序符号执行需要复杂的条件约束
2. 相比于其它自动测试技术,符号执行需要巨大的运算量

1.2 基本问题

若要符号执行运用在现实中庞大的程序中,其必须有两个特点:高效性及自动化。但其有三个基本问题需要解决:
1. 路径爆炸(Path Explosion): 符号执行很难解决现实中的大型软件因为现实中的软件路径纷乱繁杂,而且每条路径都有可能面临庞大的计算量。因此,在有限的时间内,只有一部分路径可被符号执行。
2. 路径发散(Path Divergence): 现实中程序经常是多语言混合编程或其本身是二进制文件。为这类程序生成精确的条件约束要么需要实现一个大型架构,要么就需要用户自己为关键部分建模。正因如此,从生成测试数据的那段路径开始就有可能产生多条分支。由于路径发散的问题,符号执行要么不能找到程序的关键路径,要么就需要用户自己建模从而减少自动化。
3. 复杂约束(Complex Constraints): 为条件约束进行划分问题如此难以抉择。因此生成的路径约束很有可能异常复杂。

Reference:
An Orchestrated Survey on Automated Software Test Case Generation

你可能感兴趣的:(软件测试,软件测试)