4、Pairwise测试:全组合 vs Pairwise、工具使用(PICT/AllPairs)、约束处理、实际案例:搜索筛选场景
说到组合测试,很多团队一上来就想搞「全组合」。我见过一个搜索框,光筛选条件就有8个维度,每个维度3-5个值。全组合算下来——几万条用例。测试周期只有三天。你想想看,这现实吗?
所以今天我们来聊聊Pairwise。说白了,它就是在「覆盖率」和「工作量」之间,找一个最划算的平衡点。
4.1 全组合 vs Pairwise:到底差在哪?
先看一个最简单的例子。假设我们有三个参数:
- 搜索关键词:空、有值
- 排序方式:按时间、按热度
- 筛选类型:全部、图片、视频
全组合是 2 × 2 × 3 = 12 条用例。Pairwise 呢?我直接用工具跑了一下,只需要 6 条。少了整整一半。
为什么会这样?因为 Pairwise 的核心思想是:绝大多数缺陷是由两个参数的交互触发的。三个及以上参数同时出问题的概率极低。所以,我们只需要保证「任意两个参数的所有取值组合」都被覆盖到,就够了。
我的经验: 在电商搜索项目中,我用 Pairwise 覆盖了 95% 以上的线上缺陷。剩下的 5% 是三参数交互,但那种场景极少,而且往往可以通过业务规则提前预判。
| 对比项 | 全组合 | Pairwise |
|---|---|---|
| 用例数量 | 指数级增长 | 线性增长 |
| 覆盖率 | 100% | 两两覆盖 100% |
| 执行成本 | 极高 | 可控 |
| 适用场景 | 安全、医疗等关键领域 | 绝大多数业务系统 |
4.2 工具使用:PICT 和 AllPairs
手工做 Pairwise 太痛苦了。我早期在项目里手算过,算到一半就晕了。后来发现,有现成的工具可以用。
4.2.1 PICT(微软出品)
PICT 是我个人最常用的工具。它由微软研究院开发,命令行操作,简单粗暴。
用法就三步:
- 写一个模型文件(.txt)
- 跑命令
- 拿结果
举个例子,搜索筛选场景的模型文件:
#
# 搜索筛选场景 - PICT 模型文件
#
关键词: 空, 有值
排序: 按时间, 按热度, 按价格
筛选: 全部, 图片, 视频, 文章
价格区间: 0-100, 100-500, 500+
然后在命令行执行:
pict model.txt > test_cases.txt
几秒钟,工具就吐出了所有两两组合的用例。我数了一下,全组合是 2×3×4×3=72 条,PICT 只生成了 16 条。
小技巧: PICT 支持权重设置。如果你觉得某个参数组合特别重要,可以加权重让它多出现几次。我在做价格筛选时,就把「价格区间 × 筛选类型」的权重调高了,因为这两个组合最容易出 bug。
4.2.2 AllPairs(Python 版)
如果你不喜欢命令行,AllPairs 是个好选择。它是 Python 写的,可以直接在代码里调用。
import allpairspy
parameters = [
["空", "有值"],
["按时间", "按热度", "按价格"],
["全部", "图片", "视频", "文章"],
["0-100", "100-500", "500+"]
]
pairwise = allpairspy.AllPairs(parameters)
for i, pairs in enumerate(pairwise):
print(f"用例{i+1}: {pairs}")
输出结果和 PICT 基本一致。我个人习惯用 PICT,因为它在处理大量约束时更稳定。但 AllPairs 胜在集成方便,适合自动化测试框架里直接调用。
4.3 约束处理:别让工具乱跑
工具是死的,业务是活的。如果不加约束,Pairwise 工具会生成一些「业务上不可能」的组合。
比如搜索场景里:
- 关键词为空时,排序方式只能是「按时间」
- 筛选类型为「视频」时,价格区间不能是「0-100」
这些约束如果不处理,生成的用例就是废的。
在 PICT 里,约束用 IF-THEN 语句写:
#
# 带约束的模型文件
#
关键词: 空, 有值
排序: 按时间, 按热度, 按价格
筛选: 全部, 图片, 视频, 文章
价格区间: 0-100, 100-500, 500+
# 约束条件
IF [关键词] = "空" THEN [排序] = "按时间";
IF [筛选] = "视频" THEN [价格区间] <> "0-100";
我曾经踩过的坑: 有一次忘了加约束,工具生成了「关键词为空 + 按热度排序」的用例。测试执行时发现这个组合根本点不出来,白白浪费了半天。从那以后,我每次跑 Pairwise 之前,都会先列一个「业务约束清单」,一条一条对。
4.4 实际案例:搜索筛选场景
好了,理论说完了。我们来看一个真实的案例。
去年我做了一个电商平台的搜索重构项目。搜索筛选有 6 个维度:
- 关键词(空、短词、长词、特殊字符)
- 分类(全部、服装、数码、食品、图书)
- 排序(综合、销量、价格升、价格降、最新)
- 价格区间(不限、0-50、50-200、200-1000、1000+)
- 品牌(不限、品牌A、品牌B、品牌C)
- 是否有货(全部、有货、无货)
全组合是 4×5×5×5×4×3 = 6000 条。测试周期只有 2 天。
我用 PICT 做了 Pairwise,加了 8 条业务约束,最终生成了 42 条用例。执行下来,线上发现的 3 个严重 bug,全部在这 42 条用例里覆盖到了。
其中一个 bug 是「关键词为特殊字符 + 分类为服装 + 排序为价格升」——三个参数交互才触发。但 Pairwise 为什么能抓到?因为「关键词为特殊字符 + 分类为服装」和「分类为服装 + 排序为价格升」这两对组合都被覆盖了,而 bug 恰好在这两对组合的交集里。
核心结论: Pairwise 不是万能的,但在资源有限的情况下,它是性价比最高的选择。我做了这么多年测试,90% 的场景用 Pairwise 就够了。剩下的 10%,要么是安全关键系统,要么是参数间有三阶以上强关联——那种情况,我建议你直接上全组合,或者用更高级的 n-wise 工具。
嗯,Pairwise 就聊到这儿。工具只是手段,理解背后的「两两覆盖」思想才是关键。下次你再面对一堆参数时,不妨先问问自己:真的需要全组合吗?
可可精品资料库