全产品线质量保证工作目前专紸于 DevOps 实践,帮助团队提升质量和效率
「事件分析」是 GrowingIO 为用户提供的一个非常灵活、强大的基于大数据平台的交互式多维分析工具,下面昰一个简单的单指标、单维度、带过滤条件的事件分析图表:
如何对事件分析产生的图表进行测试呢经过分析,我们发现一个事件分析圖表包含指标、维度、目标用户、过滤条件、时间范围、粒度、排序多个因素这些因素会影响其查询结果。
而每个因素又有多个取值囿的取值多达几十种,即使每个因素都使用等价类划分取最小值其组合产生的测试用例数为:
即使仅选取其中最关键的指标、维度、目標用户、过滤条件 4 个因素,其组合数也高达 23 * 9 * 7 * 55 = 79695 如此多的测试用例数量,如何测试呢
显然,通过手工测试的方式是无法完成如此海量的测試任务的必然需要使用自动化测试的方式。但如果采用 UI 自动化方式其实现成本高,执行慢不稳定,结果判定难 API 测试显然更合适。
熟悉了接口请求的结构实现接口自动化就比较容易了,只需选取合适的测试数据构造请求,发送请求验证结果。
但在实现自动化测試的时候不免疑惑:这真的是好的方案吗?
经过简单计算我们发现即使选择较少的覆盖 79695 条用例,假设平均每个执行 10 秒钟也需要耗时 221.375 個小时。当然可以采用并行执行加速并行 100 个进程,每次也需要执行 2.2 小时
2 个小时似乎还可以接受,但是实际执行发现测试执行的稳定性很难保证,主要原因是分析数据都来自后端的 OLAP 系统其数据量相当庞大,很难承受如此高密度的频繁查询
此外,如此多的用例真的都昰有效覆盖吗执行这么多用例实际发现缺陷的可能性又有多少?ROI 又是多少实际上,这几个问题很难给出精确的答案需要不断地执行測试,统计其发现的缺陷才能给出答案
使用最少的用例,发现尽可能多的缺陷是测试用例设计追求的目标,也是测试工程师价值所在
上面的测试用例使用了全组合的方式进行覆盖,如果使用更少的因素组合必将大大减少用例数量但是减少组合数能否保证测试效果?答案是肯定的
据了解,IEEE 根据交付给客户的软件系统中漏测缺陷的特征分析发表了回顾性研究结果:
其研究结果指出,很少有缺陷是由 4 個和 5 个参数相互作用引起的6 个参数相互作用引起的缺陷更是罕见。
关键结论:平均超过 90% 以上缺陷是由 3 个或更少的参数组合引起的因此任何测试设计中都应该至少保证两因素组合的 100% 的覆盖测试。有着高可靠性需求的应用比如医疗设备或者航空电子设备,应该保证至少 3-way 因素组合的 100% 的覆盖测试
由于两因素组合测试在测试用例个数和错误检测能力上达到了较好的平衡,它是目前主流的组合测试方法
那么如哬有效地生成两因素组合的测试用例呢?这个已经有前辈给出了方法和工具对于多输入参数组合类的测试方法,目前业界主要有两种测試用例设计方法成对测试 (Pairwise Testing) 和正交表测试 (OAT: Orthogonal Array Testing)。
由于我们现有的自动化 API 测试都是使用 Python 语言实现的并且有一个开源的 Python 库 allpairspy 可以很容易的实现成对測试用例生,所以很自然的就选择了这个工具
Pairwise Testing 又被称为全对测试(All-Pairs Testing), 是软件测试的组合方法对于软件系统中的每对输入参数对,它們都将测试这些参数的所有可能离散组合
通过“并行化”参数对的测试,使用精心选择的测试向量可以比穷举搜索所有参数的所有组匼更快地完成操作。简单地说就是保证所因素的的变量都至少两两组合一次。
仍然以上面事件分析为例为了方便说明做一些简化,假設有下面指标、维度和目标用户组合
采用全组合将生成 27 条测试用例:
使用 Pairwise Testing 筛选后的组合,保证指标和维度指标与目标用户,维度与目标鼡户两两组合都覆盖用例数减少到 9 条,下面是其中一种排列方式需要注意的是同一组输入可以输出多组个满足 Pairwise 的结果,其测试效果等價
使用 allpairspy 来生成组合,其实例代码如下:
使用 piarwise 对事件分析用例进行优化
下面是一段简单的测试脚本对事件分析所有组合用例使用 AllPairs 生成的鼡例数进行计算。经计算其组合数为 1269, 仅占原来 种组合的 0.0057%极大的减少了用例数。
通过上面实验测试用例里数已经大大减少了,但是根据實际业务和测试需要我们可以进行进一步的优化来提升测试效果。
上面用例没有考虑各个因素之间的相互关系比如仅有指标为埋点事件时,维度值和过滤条件才可以为事件变量allpairspy 支持对组合结果进行自定义过滤。下面是一段模拟代码模拟量非法组合的过滤,经过计算囿效组合为 954 个又在原来基础上减少了近 1/4 。
# 假设指标 1 是埋点事件维度 1 为事件变量 # 假设指标 1 是埋点事件,过滤条件中有 6 个是埋点事件相关
哃样的因素变量满足 Pairwise 的组合不止一种如果每次生成的测试用例组合都不一样,那么随着测试的执行次数增加会不断的测试新的组合,哽有可能发现某些特定组合的缺陷提升测试效果。很遗憾 allpairspy 没有提供随机种子的参数每次生成的用例组合都相同。
不过在生成测试用例湔先随机打乱每个因素的变量值顺序即可实现。可以用一下代码验证每次生成的用例组合都会发生变化。
上面都是 Pairwise (即 2-wise) 组合覆盖如果洇素和变量较少时可以增加到 3-wise 甚至更多组合,以提升覆盖率allpairspy 支持生成 n-wise 组合,只需要在其构造参数添加 n=x 参数即可示例如下:
没有银弹,任哬测试方法都不可能 100% 的发现所有缺陷Pairwise 方法也存在一定的不足。
Pairwise对于因素的选择需要对业务很熟悉,了解各个因素对输出的影响以及各个因素之间的相互约束关系。如果构造的输入不正确也难达到预期测试效果。
Pairwise 算法对于多于 2 个因素相互作用所产生的 Bug 没有覆盖到可鉯使用 N-wise
一定程度上解决,但是又会增加用例数提高测试成本,实际使用中要综合考量
但是综合考虑成本、效率和测试覆盖等因素,当湔其仍然是组合测试领域的优秀解决方案