引言:我们不是在“挑刺”,而是在“守护”
作为一名软件测试工程师,你是否曾面临过这样的困境?面对一个拥有无数可能输入的巨大系统,感到无从下手?时间紧迫,任务繁重,如何用最少的测试用例发现最多的潜在缺陷?或者,你是否曾经因为一个极其简单的边界问题(比如,某个输入框要求年龄在1-99岁,你却只测试了50这个“正常”值)导致线上事故,而后追悔莫及?
如果你有过类似的经历或疑虑,那么今天这篇文章就是为你准备的。我们将深入探讨软件测试领域两大最基础、最实用、也是最核心的黑盒测试技术:等价类划分 与 边界值分析。掌握它们,你将不再是凭感觉“点点点”的测试新手,而是拥有科学方法论武装的“缺陷猎人”。
在深入细节之前,我们首先要明白一个基本概念:穷尽测试是不可能的。
试想一个简单的用户登录框,有“用户名”和“密码”两个输入框。假设用户名长度限制为1-20个字符,密码长度限制为6-16位。即便我们不考虑字符类型(数字、字母、特殊符号),只考虑长度组合,可能的测试用例数量也是一个天文数字。更不用说那些拥有几十个输入字段的复杂业务表单了。
因此,我们必须从无限的测试数据中,科学地筛选出有限且最具代表性的测试用例集合。我们的目标是:“以最小的代价,获取最高的测试收益”。这正是等价类划分和边界值分析诞生的初衷。
1. 什么是等价类划分?
等价类划分的核心思想非常直观:程序的输入数据集合可以划分为若干个子集,每个子集中的数据在揭露程序错误方面是等价的。 也就是说,如果这个子集里的一个数据能发现缺陷,那么子集里的其他数据很可能也能发现同样的缺陷;反之,如果一个数据不能发现缺陷,那么其他数据很可能也不能。
这样,我们就不需要测试子集里的所有数据,而只需从每个子集中选取一个代表进行测试即可。
2. 等价类的类型
我们通常将等价类划分为两种类型:
3. 等价类划分的步骤与实践
让我们通过一个经典的案例来学习如何应用等价类划分。
案例:某网站用户注册页面,要求输入“用户名”,规则如下:
第一步:划分等价类
我们为每个输入条件划分有效和无效等价类,并编号。通常可以制成表格:
输入条件 | 有效等价类 | 编号 | 无效等价类 | 编号 |
---|---|---|---|---|
用户名是否填写 | 已填写 | (1) | 为空 | (4) |
用户名长度 | 3-15字符 | (2) | 长度<3(如“ab”) | (5) |
长度>15(如“abcdefghijklmnopq”) | (6) | |||
用户名字符类型 | 字母和数字组合 | (3) | 包含非字母数字字符(如“user@name”) | (7) |
全部为数字(规则未禁止,但通常视为有效,此处为演示,可归为(3)。但若规则强调必须包含字母,则需单独划分) | ||||
全部为字母(规则允许,属于(3)) |
注意:在实际项目中,需要与产品经理或开发人员确认“全部为数字”或“全部为字母”是否合法。本例中我们假设合法。
第二步:设计测试用例
Tom123
(覆盖(1)已填写、(2)长度3-15、(3)字母数字组合)。这是一个“阳光路径”的测试。空
(覆盖无效等价类(4))。ab
(覆盖无效等价类(5),长度<3)。abcdefghijklmnopq
(覆盖无效等价类(6),长度>15)。user@name
(覆盖无效等价类(7),包含非法字符)。通过这5个测试用例,我们系统地覆盖了所有划分出的等价类。相比于盲目的成千上万次测试,效率得到了质的飞跃。
1. 为什么边界值如此重要?
有一句在测试界广为流传的箴言:“错误更可能出现在边界附近”。这并非迷信,而是源于程序员的思维习惯。
在编写代码时,开发者经常使用 >
、>=
、<
、<=
这类判断条件。一不小心,就容易把 >=
写成 >
,导致边界点被错误地包含或排除。例如,本该接受18岁及以上用户,却因为代码写成了 if (age > 18)
,而将刚满18岁的用户拒之门外。
边界值分析就是专门针对这种“边界性错误”的测试技术。
2. 边界值分析的方法
对于一个取值范围 [min, max]
,边界值分析关注的是边界点及其邻域。
案例:延续上面的用户名案例(长度要求3-15字符)
根据边界值分析,我们需要测试的长度边界点是:2, 3, 4, 14, 15, 16。
我们可以设计以下测试用例(假设用户名为纯字母以简化):
ab
(2字符,无效)abc
(3字符,有效)abcd
(4字符,有效)abcdefghijklmn
(14字符,有效)abcdefghijklmno
(15字符,有效)abcdefghijklmnop
(16字符,无效)在真实的项目测试中,我们绝不会孤立地使用其中一种技术。等价类划分和边界值分析是天生的一对搭档。
结合策略:
综合实战:测试一个“订单折扣”计算功能
需求: 单笔订单金额在100元(含)至500元(不含)之间,享受9折优惠;金额在500元(含)以上,享受8折优惠;金额低于100元无折扣。
步骤1:划分等价类
步骤2:为每个等价类运用边界值分析选取测试数据
步骤3:合并优化测试用例
现在,我们得到了一系列测试点。为了避免重复,我们可以合并优化成最终的测试用例集:
用例编号 | 输入金额 | 预期结果 | 覆盖的等价类/边界 |
---|---|---|---|
1 | -50 | 错误提示 | E4(无效等价类) |
2 | 0 | 无折扣,实付0元 | E1边界(min) |
3 | 99 | 无折扣,实付99元 | E1边界(max-1) |
4 | 100 | 9折,实付90元 | E1/E2边界,E2边界(min) |
5 | 499 | 9折,实付449.1元 | E2边界(max-1) |
6 | 500 | 8折,实付400元 | E2/E3边界,E3边界(min) |
7 | 501 | 8折,实付400.8元 | E3内部值 |
8 | 99999 | 8折,实付79999.2元 | E3极大值 |
通过这8个精心设计的测试用例,我们不仅覆盖了所有有效和无效的等价类,还重点攻击了所有可能出错的边界。这套用例集的效率极高,缺陷发现能力极强。
进阶思考:决策表 当输入条件之间存在逻辑依赖关系时,等价类和边界值可能不够用。例如,“用户是VIP且订单金额大于200元,则免运费”。这时,决策表 技术就派上用场了,它可以系统地梳理各种条件组合及其对应的结果,是更强大的测试设计工具。
等价类划分和边界值分析,看似简单,却是测试工程师安身立命的根本。它们体现了测试工作的精髓:在混沌中建立秩序,在无限中寻找有限,在风险最高的地方投入精力。
掌握它们,意味着你开始用工程化的思维替代感性的点击。但这仅仅是起点。测试不仅是一门技术,更是一门艺术。如何更精准地划分等价类?如何在复杂业务场景下灵活组合多种测试技术?如何将测试用例写得清晰、可维护?这些都需要你在实践中不断思考和沉淀。
现在,就打开你正在测试的项目,找一个简单的输入框,尝试用今天学到的方法论去设计测试用例吧。你会发现,一个全新的、更加清晰的测试世界,正在向你敞开大门。
本文原创于【程序员二黑】公众号,转载请注明出处!
欢迎大家关注笔者的公众号:程序员二黑,专注于软件测试干活分享,全套测试资源可免费分享!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。