用例自动生成技术调研
一、用例自动生成
背景
测试用例的数量和质量影响缺陷发现的能力。在已成型但迭代频繁的项目中,人力和时间资源有限,自动生成规范且精准的测试用例能科学的指导测试过程和加快测试整体进度。
问题对象:
业务逻辑复杂时编写场景用例复杂,接口自动化维护成本高;
常用技术分类:
流量回放:流量录制回放是通过复制线上真实流量(录制)然后在测试环境进行模拟请求(回放)验证代码逻辑正确性。这种办法能高效生成丰富的测试用例、完美模拟用户真实行为、发现线上问题,可使用的流量回放工具有GoReplay,TcpCopy,Nginx,sandbox-repeter等,但是录制回放有底层开发要求高,针对多个系统效率比较低下等问题。
基于符号执行:以符号值作为输入找到路径约束,再利用约束求解器如Z3(类似解方程)得到具体输入值作为用例,但是路径爆炸、复杂约束求解、运算量巨大的难题。
基于模型:创建有限状态机、马尔可夫链等程序可以理解和执行的行为描述,但自动化创建模型有难度;比如嵌入式系统测试常使用。
基于搜索:通过定义适应度函数,将测试用例自动生成问题转化为目标优化问题,进而用各类如多目标帕累托优化等搜索算法来解决。
其他:混合型测试
过程
1、生成测试数据
方法一:人工撰写数据生成方法生成特定的类型或格式的数据,并且和Coverage-guided方法结合的方法
方法二:XML配置的自动化数据生成方法,将复杂的实体类对象生成器进行基于属性的改造,并且引入线上录制的流量数据
改进点:
采用组合测试的技术,有效覆盖需要现有参数值特定组合,在实体对象类参数值的生成上,利用Randoop和EvoSuite生产的方法序列来提取高效的方法子序列自动合成数据。
2、生成测试预言
自生成测试预言有商用工具ParasoftJtes、Agitar的AgitarOne等,都是通过捕获方法返回值合成回归测试断言或推断出运行态状态遵循的属性规约的机器学习技术。
改进点:
在数据回放过程中,对被测公共方法通过Daikon插装来学习不变量,存在目标属性太复杂、不变量的噪声高等问题。
二、成对组合测试
1、Pairwise是什么?
在自动化用例设计过程中,有时会遇到很多变量进行组合的情况,两个或更多变量时,可能的组合会达到很大的量。与正交分解法、等价类分析、边界值分析、错误推测发、判定表因果图、基于模型测试、基于风险模型、场景分析方法一样,Pairwise Testing也是一种测试用例分析方法。
2、为什么研究Pairwise?
Pairwise是基于数学统计和对传统的正交分析法进行优化后得到的产物。Mandl于1985年在测试程序时提出的,Cohen等人应用程度组合覆盖测试技术对Unix中的“Sort”命令进行了测试,测试结果表明覆盖率高达90%以上。如果穷举所有的随机组合,来达到最优解,那么时间和空间复杂度会随着入参因子的增多将呈指数级上涨。
Pairwise基于如下2个假设:
- 每一个维度都是正交的,即每一个维度互相都没有交集;
- 根据数学统计分析,73%的缺陷(单因子是35%,双因子是38%)是由单因子或2个因子相互作用产生的,19%的缺陷是由3个因子相互作用产生的。因此,Pairwise基于覆盖所有2因子的交互作用产生的用例集合性价比最高而产生的。
3、Pairwise什么时候用?
变量的组合特地大的时候
参数值很容易划分等价类
改进点:
实际业务中参数存在强弱关系、相互约束、异常等价等问题,
4、Pairwise算法怎么实现?
实现见Pairwise实现(python篇)、Pairwise实现(Java篇)
5、Pairwise怎么用?
1)在python中应用的itertools.pairwise()函数
2)微软的PICT
简述:
PICT工具在生成测试用例时使用的是启发式算法(greedy heuristic),此算法的主要思想就是用精度换复杂度,,在每次生成用例时候会在相对较快的时间生成相对精简的用例(可能不是最优解)。基本思路是先将参数进行正交组合(根据用户配置的组合维度,默认是两两组合),然后根据每种组合进行生成用例。
假设我们有如下的入参列表:
A
|
0
|
1
|
-
|
B
|
2
|
3
|
4
|
C
|
5
|
6
|
7
|
将A B C三个入参两两组合,分别为AB,AC,BC 对于这三个组合的可能值如下,AB列与AC列均为6种组合,BC列有9种组合,每个组合有三种状态 覆盖,未覆盖,被约束,在最初状态,所有组合均为未覆盖状态。先从拥有未覆盖组合最多的列随机选择一个组合用于生成用例,并将这个组合标记为已覆盖(同优先级的情况下随机选择一个组合,此处以优先左上的原则来填入(同优先级的情况下选择最左上的组合),直到达到了覆盖所有两两组合的需求。
总结:
重复以下步骤知道覆盖所有两两组合:
Step1:从包含最多未覆盖组合的列中随机选择一列放入到生成列表中;
Step2:再从其他列中选择可以覆盖最多其他组合的组合填入到生成列表中(并且保证不能违反约束条件)若没有,则随机选择一个未违反约束条件的组合填入;
Step3:生成测试用例,将所覆盖的组合标记为已覆盖;
3)其他:Hexawise、Automatic Effcient Test Generator or AETG