PICT工具算法图解

上一篇文章已经对PICT工具的基本获取以及使用做了介绍,本文将介绍PICT工具的核心生成用例的算法

PICT工具算法思想

PICT工具在生成测试用例时,使用的是启发式算法(greedy heuristic),此算法的主要思想就是用精度换复杂度,应用到PICT工具上就是 在每次生成用例时候会在相对较快的时间生成相对精简的用例(注意,不是最精简的),换句话说 就是生成用例的条数可能不是最少的(可能不是最优解).

对于工具生成用例的流程,主要分为两大步骤,组合生成

即先将参数进行正交组合(根据用户配置的组合维度,默认是两两组合),然后根据每种组合进行生成用例. 下图是PICT生成用例部分的算法伪代码:
在这里插入图片描述
这个伪代码看起来比较生硬,如果在不了解PICT内部基本运行流程的情况下之间来看这个伪代码,会比较吃力.接下来我会图解演示这个伪代码的执行流程.在看完图解演示后回看这个伪代码,可能就会理解了.

图解演示

假设我们有如下的入参列表:

A01-
B234
C567

为方便起见,我们对这些参数不添加任何的约束条件.

首先我们先将A B C三个入参两两组合,分别为AB,AC,BC 对于这三个组合的可能值如下:
在这里插入图片描述
在组合好后,AB列与AC列均为6种组合,BC列有9种组合.对于每一个组合,PICT工具会将其分为三种状态 覆盖,未覆盖,被约束,由于我们此次演示不写入任何约束条件,所以对于所有的组合只有 覆盖和未覆盖两种状态.在最初状态,所有组合均为未覆盖状态.

根据PICT中算法的思想,先从拥有未覆盖组合最多的列随机选择一个组合用于生成用例(同优先级的情况下随机选择一个组合).
为了演示方便,我们此处使用优先左上的原则来填入(同优先级的情况下选择最左上的组合).

因此我们首先选择BC=25填入生成列表,并将这个组合标记为已覆盖(黄颜色背景):
在这里插入图片描述
在填入之后,就限定了当前用例的B=2,C=5.因此,我们需要在AB,AC列中找出满足这两个条件的所有组合:
AB=02,12 AC=05,15
根据同优先级左上优先的原则,我们填入AB = 02,在填A=0后,此用例也满足AC=05,因此将这个组合也标记为覆盖.
在这里插入图片描述
第1条用例 0,2,5 生成了.

接下来重复上面步骤,找出拥有包含未覆盖组合最多的列.目前还是BC中最多,选择BC=26填入生成列表中,并将其标记为覆盖.

在这里插入图片描述
然后从AB,AC中寻找满足BC=26的未覆盖组合,分别为: AB=12,BC=06,16. 如果填入AB=12,可以外覆盖AC=16,填入AC = 06,则无法额外覆盖其他组合,因此优先级比填入 AB=12,AC=16低,根据左上优先选择,我们填入AB=12来生成用例,并且额外覆盖了AC=16:
在这里插入图片描述

第2条用例 1,2,6 生成了.

继续重复上面步骤,从BC中选择BC=27填入,并将其标记为覆盖:
在这里插入图片描述
AB,AC中满足BC=27的未覆盖组合为 AC=07,17 而这两个填入后均无法额外覆盖其他组合,所以优先级一致,根据左上原则,我们填入AC=07,并将其标记为覆盖:
在这里插入图片描述
第3条用例 0,2,7 生成了.

继续重复,填入BC=35,并将其标为已覆盖:
在这里插入图片描述
AB,AC中满足BC=35的分别为 AB=03,13 BC=15 而只有填入AB=13可达到额外覆盖其他组合(AC=15),所以填入AB=13,并将所覆盖的标记为已覆盖:
在这里插入图片描述
第4条用例 1,3,5 生成了.

接下来重复上面步骤,填入BC=36,并将其标为覆盖:
在这里插入图片描述
AB,AC中满足BC=36的为AB=03,AC=06,而这两个随便填入一个都可以将对方覆盖,所以我们选择AB=03填入,并将所覆盖的标记为已覆盖:
在这里插入图片描述
第5条用例 0,3,6 生成了.

重复上述步骤,选择BC=37填入,将其标记为覆盖:
在这里插入图片描述
此时AB,AC的未覆盖组合中,只有AC=17满足此条件,所以填入AC=17
在这里插入图片描述
第6条用例 1,3,7 生成了.

重复上面步骤,选择BC=45填入:
在这里插入图片描述
因为AC已经全部被覆盖,所以从AB中寻找满足BC=45的未覆盖组合,AB=04,14均满足,根据左上优先原则,我们选择AB=04填入:
在这里插入图片描述
第7条用例 0,4,5 生成了.

继续重复上面步骤,选择BC=46填入:
在这里插入图片描述
AB中仅剩的AB=14满足此条件,将其填入:
在这里插入图片描述
第8条用例 1,4,6 生成了.

接下来填入最后一个没有被覆盖的组合 BC=47,因为AB,BC中所有的组合均已被覆盖,所以根据左上优先原则,选择AB=04填入,即可覆盖所有的组合:
在这里插入图片描述
第9条用例 0,4,7 生成了.

最后,我们生成了所有组合的用例,一共9条.

需要补充的是,PICT工具对于在选择同优先级的组合时,使用的是随机选择的,而我们使用的是左上角优先的原则来的,因此将这些入参填入到PICT工具的txt中,生成的具体用例可能与本次演示的不一致,但均达到了覆盖所有两两组合的需求.

这样我们在此回看伪代码,能明白一些了
在这里插入图片描述
整个伪代码的意思大致如下:

  1. 从包含最多未覆盖组合的列中随机选择一列放入到生成列表中(ri)
  2. 再从其他列中选择可以覆盖最多其他组合的组合填入到生成列表中(并且保证不能违反约束条件),若没有,则随机选择一个未违反约束条件的组合填入,
  3. 生成测试用例,将所覆盖的组合标记为已覆盖

在文中所提到的启发式算法,其实就是在生成用例时选择随机选择一个组合填入,最终生成的用例可能因为随机的组合不同而造成用例数量大小不等.但最终大小相差并不会太大,在可接受的范围.如果我们穷举所有的随机组合,来达到最优解,那么时间和空间复杂度会随着入参因子的增多将呈指数级上涨,不切实际.所以PICT选择了启发式算法,在相对较短的时间内生成较优解.

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值