在软件测试中,划分等价类是为了减少测试用例数量,同时保证覆盖。核心思路是:如果一组输入,程序对它们的处理方式应该相同,那它们就属于同一个等价类。
· 有效等价类:符合需求规格、合理、有意义的输入,用于验证程序应该做什么。
· 无效等价类:不符合需求、不合理、无意义的输入,用于验证程序不该做什么。
划分步骤
- 分析需求:明确输入条件(如类型、范围、格式等)。
- 找有效类:满足所有条件的输入为一个有效等价类。
- 找无效类:从反方向考虑每个条件。常见角度包括:空值、越界、错误类型、错误格式等。注意,每个违规条件通常单独成为一个无效类,因为它们可能触发不同的错误。
举例 1:输入一个1-100之间的整数(包括1和100)
· 有效等价类:1到100之间的任意整数,比如 50、1、100。
· 无效等价类:
- 小于1:如 0、-5
- 大于100:如 101、200
- 非整数(小数):如 50.5
- 非数字(字母、特殊字符):如 abc、@#$
举例 2:用户名注册,要求长度为6-10位,只能包含字母、数字、下划线
· 有效等价类:长度6-10,且只含字母/数字/下划线,如 user_01、abc123。
· 无效等价类:
- 长度小于6:如 ab123
- 长度大于10:如 abcdefghijk
- 包含非法字符(如连字符、空格、中文):如 user-01
- 空值或仅空格
- 全为数字或全为下划线(虽然不常见,但规则允许,所以是有效的;若规则禁止纯数字,则另当别论)
举例 3:登录功能,密码非空
· 有效等价类:任何非空的密码,如 mypass、123。
· 无效等价类:
- 密码为空(不输入任何字符直接提交)
- 密码仅为空格(如果系统不自动trim)
关键提醒
· 并非所有条件都有无效类。例如,需求规定“性别:男或女”,若用下拉框选择,用户无法输入错误值,那么无效等价类可以不测。
· 边界值要单独测,因为边界最容易出错。等价类只负责选出代表值,边界值分析是另一种技术。
· 有效类通常只有一个,但如果有多个独立条件需要同时满足,可能会有多个有效组合。
· 实际测试时,每个等价类至少选一个代表值设计测试用例。
等价类划分和边界值分析通常组合使用:先用等价类分出“范围”,再重点测试这个范围的边界上及边界附近的值,因为边界是最容易出错的地方。
核心原则:测边界,不测中间。对于有效等价类,不只取一个代表值(如50),而要测边界值(1、100)。对于无效等价类,则测刚好越界的值。
结合步骤
- 划分等价类:找出有效和无效等价类。
- 确定边界:找到有效类的上点(正好在边界上)、内点(区间内任意点)、离点(离边界最近,但在边界外)。
经典应用:输入范围 [1, 100]
· 有效类:1-100
· 无效类:<1, >100
边界值分析取值(通常取3个值:边界值、边界-1、边界+1):
· 有效类的边界:1, 100 (上点)
· 有效类内部任一点:50 (内点)
· 无效类的离点:0 (刚好小于1), 101 (刚好大于100)
测试用例取值:0, 1, 50, 100, 101 (共5个)
进阶:双边界(闭合区间)
如果输入必须同时满足两个边界,如 日期:2025-01-01 到 2025-12-31:
· 上点:2025-01-01, 2025-12-31
· 内点:2025-06-01
· 离点:2024-12-31, 2026-01-01
特殊场景:开区间或半开区间
需求说 > 0 且 < 100 (不含0和100):
· 有效类:1-99 (因为整数场景)
· 边界:1 和 99 是有效边界
· 离点:0 和 100 是无效边界
· 取值:0, 1, 50, 99, 100
多变量时的优化(n个变量)
每个变量都取边界值,但组合起来用例会爆炸。常用 边界值分析 或 健壮性测试:
· 基本边界值分析:所有变量取正常值,只让一个变量取边界值(-1, 边界, +1)。用例数 ≈ 4n+1。
· 例:x∈[1,100],y∈[10,20] → 测试 x=1,50,100,同时 y=15;再测 y=10,15,20,同时 x=50。
· 健壮性测试:额外测离点(0, 101, 9, 21)。
· 最坏情况:所有变量取边界值的组合(用例多,用于高可靠性场景)。
实际应用示例:年龄输入框(1-120岁,整数)
测试数据:
· 0 (无效离点)
· 1 (有效上点)
· 50 (有效内点)
· 120 (有效上点)
· 121 (无效离点)
如果允许小数,还需测试边界附近的小数,如 0.9, 1.0, 1.1, 119.9, 120.0, 120.1。
总结:什么时候重点用边界值?
· 输入是数值范围、日期范围、长度限制(如字符串长度1-10)
· 有循环、数组索引、集合大小的临界点
· 输入条件包含≥、>、≤、< 时
边界值 + 等价类 = 高性价比的测试设计。
当输入条件之间存在逻辑依赖(比如“如果满足条件A且不满足条件B,则结果X”),或者有多个条件组合出不同结果时,等价类和边界值就不够用了。这时需要判定表。
判定表能把条件组合和预期结果系统地列出来,避免遗漏,特别适合处理复杂的业务规则。
判定表的结构
一个典型的判定表由四部分组成:
· 条件桩:列出所有输入条件(通常是布尔值,如真/假)。
· 动作桩:列出所有可能的输出结果或操作。
· 条件项:具体列出条件在各组合下的取值(如Y/N, 1/0)。
· 动作项:对应每种组合,哪些动作会执行。
经典案例:打印机故障诊断
· 条件桩:1. 发打印命令了吗? 2. 有纸吗? 3. 有墨吗?
· 动作桩:A. 正常打印;B. 提示“缺纸”;C. 提示“缺墨”;D. 无响应。
完整的判定表(2³ = 8种组合)如下:
| 条件/动作 | 规则1 | 规则2 | 规则3 | 规则4 | 规则5 | 规则6 | 规则7 | 规则8 |
|---|---|---|---|---|---|---|---|---|
| 命令? | Y | Y | Y | Y | N | N | N | N |
| 有纸? | Y | Y | N | N | Y | Y | N | N |
| 有墨? | Y | N | Y | N | Y | N | Y | N |
| 动作: | ||||||||
| 正常打印 | X | |||||||
| 缺纸 | X | X | ||||||
| 缺墨 | X | X | ||||||
| 无响应 | X | X | X | X |
制作步骤
- 确定输入和输出:找出所有影响结果的条件,以及所有可能的动作。
- 计算组合数:若每个条件有2种状态,n个条件最多有 2ⁿ 种组合。
- 填充判定表:列出所有组合,并填入对应规则下的动作。
- 简化判定表:合并“与结果无关”的相似规则。 · 例如:只要“没发命令”(规则5-8),无论纸墨如何,结果都是“无响应”。这4条可以合并为1条,用“N”和“-”(任意值)表示。 · 合并后:规则1、规则2、规则3、规则4、规则5(命令=N,其他任意)。
- 根据每一列规则设计测试用例:一列就是一个测试用例。
登录功能的判定表示例
· 条件:1. 用户名正确? 2. 密码正确?
· 动作:A. 登录成功;B. 提示“用户名或密码错误”。
| 条件/动作 | 规则1 | 规则2 | 规则3 | 规则4 |
|---|---|---|---|---|
| 用户名正确? | Y | Y | N | N |
| 密码正确? | Y | N | Y | N |
| 动作: | ||||
| 登录成功 | X | |||
| 提示错误 | X | X | X |
· 规则2、3、4结果相同,理论上可以合并,但通常为了更直观,也可以保留。
· 测试用例:共4个用例。
关键提醒
· 适用场景:业务规则复杂、条件组合多、有逻辑依赖(如“如果A则B,否则C”)。
· 不适用场景:条件间没有逻辑组合,或输入是连续数值范围(此时用等价类+边界值)。
· 组合爆炸:当条件超过4-5个时,2ⁿ 组合会非常多。可以先分析条件间的依赖关系,用“决策树”或“正交试验”来精简。
· 与其他方法结合:通常先用等价类处理每个条件的取值范围,再用判定表处理组合逻辑。判定表一列就是一个测试用例,设计时可以直接取等价类的代表值。
判定表在条件超过4-5个时,组合数会爆炸(比如10个条件就有1024种组合)。正交试验法能从全量组合中,选出少量有代表性的组合,用最小的成本覆盖“两两组合”的情况,是解决组合爆炸的实用方法。
核心思想
正交试验法基于正交表(如 L9(3^4)),它保证:
· 均衡分散:每个条件的每个取值,出现的次数相同。
· 整齐可比:任意两个条件的所有取值组合,都会出现且只出现一次(即两两覆盖)。
换句话说,它不测所有组合,但保证任意两个条件的所有搭配都被测到。软件测试中,大部分Bug也恰恰由某两个条件共同触发。
应用步骤
-
确定因素与水平
· 因素:输入条件(如浏览器、操作系统)。
· 水平:每个条件的具体取值(如浏览器有Chrome、Safari)。
-
选择或构造正交表
· 因素数和水平数需与正交表匹配。
· 没有完全匹配的,选择刚好能容纳的表(行数稍多、列数稍多的)。
-
映射并生成测试用例
· 把正交表的“值”替换成实际取值,一行就是一条测试用例。
-
补充可疑组合
· 正交表只保证两两组合。如果某三个条件组合风险很高,需手动补充。
举例:网页兼容性测试
· 因素:浏览器(Chrome, Safari, Firefox),操作系统(Win, Mac, Linux),屏幕分辨率(1920x1080, 1366x768, 1280x720)
· 水平数:3个因素,每个因素3个水平。
全组合:3×3×3 = 27种。用标准正交表 L9(3^4)(9行,4列,3水平),只需9条用例。
| 用例 | 浏览器 | 操作系统 | 分辨率 |
|---|---|---|---|
| 1 | Chrome | Win | 1920x1080 |
| 2 | Chrome | Mac | 1366x768 |
| 3 | Chrome | Linux | 1280x720 |
| 4 | Safari | Win | 1366x768 |
| 5 | Safari | Mac | 1280x720 |
| 6 | Safari | Linux | 1920x1080 |
| 7 | Firefox | Win | 1280x720 |
| 8 | Firefox | Mac | 1920x1080 |
| 9 | Firefox | Linux | 1366x768 |
这9条用例,任意两个条件(比如Chrome+Win、Safari+Mac等)的组合都恰好出现一次。
不同水平数的处理
如果因素水平数不同,例如:浏览器(Chrome, Safari)、操作系统(Win, Mac, Linux)、分辨率(1920x1080, 1366x768)。
· 混合水平正交表:如 L6(2^1 × 3^2),表示1个2水平因素、2个3水平因素,共6行。
· 也可以按最大水平数选表,把不足的取值重复填充(取任意值)。
常见正交表
· 2水平:L4(2^3), L8(2^7)
· 3水平:L9(3^4), L27(3^13)
· 混合水平:L6(2^1 × 3^2), L12(2^1 × 3^1 × 4^1)
与其他方法的对比
· 等价类/边界值:处理单个输入范围。
· 判定表:处理逻辑组合,但组合多时用例爆炸。
· 正交试验:组合多时,用两两覆盖精简用例。
· pairwise testing:正交试验是它的实现方式之一。更灵活的工具(如PICT)能自动生成最优组合。
关键提醒
· 适用场景:配置测试(浏览器/OS/分辨率)、参数组合多的接口测试。
· 局限性:只保证两两组合。如果三个条件组合才出现的Bug,可能会漏测,需手动补充。
· 实践经验:先跑正交试验的用例,时间充裕再逐步增加强度(如三三组合)。
PICT(Pairwise Independent Combinatorial Testing)是微软开发的免费命令行工具,能根据你定义的参数和取值,自动生成精简的测试用例组合,尤其适合多参数配置测试。
第一步:安装与准备
PICT是绿色免安装工具,下载后配置环境变量即可全局使用。
- 下载PICT
· 官方渠道(推荐):访问 GitHub Releases 页面 github.com/microsoft/p…,选择最新版本下载 pict.exe。
· 存放位置:建议在 C:\Tools\PICT 下新建文件夹存放 pict.exe,便于管理。
- 配置环境变量(可选)
· 若想在命令行任意路径下使用 pict 命令,需将 pict.exe 所在文件夹路径添加到系统 PATH 环境变量中。
· 不配置环境变量:也可以在 pict.exe 所在目录下,通过在路径前加 .\ 运行,如 .\pict model.txt。
第二步:编写模型文件
用文本编辑器创建一个 .txt 或 .pict 文件,核心语法是:
格式:参数名: 值1, 值2, 值3, ... 注释:以 # 开头的行
示例:登录功能参数模型 (login_model.txt)
# 登录功能测试模型
用户名: 空, 不存在, 超长, 正常
密码: 空, 不匹配, 正常
验证码: 正确, 错误
第三步:生成测试用例
-
打开命令行:Win + R 输入 cmd 并回车。
-
进入文件目录:使用 cd 命令切换到模型文件所在目录,例如 cd C:\my_test_models。
-
运行PICT:
· 直接显示在屏幕:执行 pict login_model.txt,生成的用例表格会直接打印在命令行窗口。
· 导出到文件(推荐):执行 pict login_model.txt > test_cases.txt。这会将结果保存到 test_cases.txt 文件中,方便查看和编辑。
高级功能:约束与子模型
实际测试中,某些参数组合本身无效,需要排除。
- 约束条件 (Constraints) 使用 IF...THEN... 语句排除无效组合。必须以分号 ; 结尾。
# 文件系统测试模型
Size: 10, 100, 5000, 40000
File system: FAT, FAT32, NTFS
# 约束条件
IF [File system] = "FAT" THEN [Size] <= 4096;
IF [File system] = "FAT32" THEN [Size] <= 32000;
说明:当文件系统为 FAT 时,Size 必须小于等于 4096,否则不会生成这条组合。
- 子模型 (Sub-models) 默认PICT保证所有参数两两组合。若想加强某几个参数的组合强度,可使用子模型。
PLATFORM: x86, x64, arm
CPUS: 1, 2, 4
RAM: 1GB, 4GB, 64GB
OS: Win7, Win10, Linux
Browser: Chrome, Firefox, Edge
# 子模型
{ PLATFORM, CPUS, RAM } @ 3 # 这3个参数进行三三组合
{ OS, Browser } @ 2 # 这两个参数进行两两组合
避坑指南:解决中文乱码
模型文件或生成的结果中包含中文时,命令行可能显示乱码。解决办法如下:
- 使用正确的编码:用记事本打开模型文件,点击“文件” -> “另存为”,在对话框底部将“编码”从默认的 UTF-8 改为 ANSI,然后保存。
- 切换命令行字符集:在运行PICT命令前,先在cmd窗口中执行 chcp 936,将代码页切换为简体中文。
PICT工作流程总结
- 分析需求:梳理出所有需要组合的测试参数及其取值。
- 编写模型:在文本文件中按 参数名: 值1, 值2, ... 格式编写。
- 定义规则:根据需要,添加 IF...THEN... 约束条件来剔除无效组合。
- 生成用例:在命令行执行 pict model.txt > output.txt。
- 审查与使用:打开生成的 output.txt,用例即可直接用于测试执行。