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 是我个人最常用的工具。它由微软研究院开发,命令行操作,简单粗暴。

用法就三步:

  1. 写一个模型文件(.txt)
  2. 跑命令
  3. 拿结果

举个例子,搜索筛选场景的模型文件:

#
# 搜索筛选场景 - 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 就聊到这儿。工具只是手段,理解背后的「两两覆盖」思想才是关键。下次你再面对一堆参数时,不妨先问问自己:真的需要全组合吗?

Pairwise 测试核心逻辑 参数模型 关键词、排序、筛选... 业务约束 IF-THEN 规则 Pairwise 引擎 PICT / AllPairs 两两组合生成 测试用例 42条(示例) 全组合 vs Pairwise 对比 全组合 覆盖所有参数组合 用例数:6000条 执行时间:不可行 ❌ 成本过高 Pairwise 覆盖两两组合 用例数:42条 执行时间:2天 ✅ 性价比最优 核心思想:绝大多数缺陷由两参数交互触发,三参数及以上概率极低

可可精品资料库