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