实战演练:用等价类划分法为城市电话号码设计测试用例
1. 等价类划分法入门从电话号码说起刚入行测试那会儿我最怕接到验证电话号码格式的任务。直到组长扔给我一本《软件测试基础》里面提到的等价类划分法简直打开了新世界的大门。简单来说这个方法就像给数据做垃圾分类——把相似的输入归到同一个桶里每个桶选几个代表测试就够了。拿城市电话号码来说常见的格式规则包括地区码要么空白要么是3位纯数字前缀3位数字但不能以0或1开头后缀必须是4位纯数字这就像我们小区快递柜的取件码前三位是柜子编号不能为0开头后四位是验证码。测试这种规则时没必要把所有数字组合都试一遍只需要验证典型情况即可。2. 实战拆解电话号码的等价类划分2.1 地区码的划分技巧地区码这个字段很有意思它允许空白也允许3位数字。根据这个特点我们可以划分出有效等价类空白比如 234-56783位纯数字比如(021)234-5678无效等价类3. 包含字母如(A21)234-5678 4. 不足3位如(12)234-5678 5. 超过3位如(0213)234-5678我曾经踩过一个坑测试时漏掉了带空格的无效情况如(02 )234-5678结果上线后发现有用户这样输入导致系统崩溃。所以划分时要像侦探一样把所有可能的异常情况都考虑到。2.2 前缀的特殊规则处理前缀的规则更复杂些需要特别注意不能以0或1开头这个限制有效等价类6. 200-999之间的3位数字如234-5678无效等价类7. 包含非数字字符如2A4-5678 8. 以0开头如034-5678 9. 以1开头如134-5678 10. 不足3位如24-5678 11. 超过3位如2345-5678这里有个实用技巧测试边界值时除了测试200和999这两个边界还要测试199和1000这两个刚好越界的情况。2.3 后缀的简单规则后缀的规则相对简单但也不能掉以轻心有效等价类12. 4位纯数字如234-5678无效等价类13. 包含非数字字符如234-56A8 14. 不足4位如234-568 15. 超过4位如234-567893. 测试用例设计实战3.1 有效用例设计原则设计有效测试用例时要记住两个黄金法则一个用例尽量覆盖多个有效等价类确保所有有效等价类都被覆盖比如这两个典型用例(021) 805-9321覆盖了地区码3位数字、前缀非0/1开头、后缀4位数字 276-2345覆盖了地区码空白、前缀非0/1开头、后缀4位数字3.2 无效用例设计要点对于无效用例必须遵守一次只破坏一个规则的原则地区码无效用例(20A)123-4567含字母(33 )234-5678不足3位(7777)345-6789超过3位前缀无效用例(777)34A-6789含字母(234)045-6789以0开头(777)145-6789以1开头后缀无效用例(777)345-678A含字母(777)345-678不足4位(777)345-56789超过4位4. 常见踩坑与优化建议4.1 新手容易忽略的测试点极端空格情况地区码括号内的空格( 21)234-5678连接符两侧的空格234 -5678特殊字符注入SQL注入尝试234); DROP TABLE users--全角数字使用中文输入法输入的数字4.2 自动化测试实践用Pythonunittest实现基础验证import re import unittest def validate_phone(phone): pattern r^(\(\d{3}\)|\d{3})[- ]?\d{3}[- ]?\d{4}$ return bool(re.match(pattern, phone)) class TestPhoneValidation(unittest.TestCase): def test_valid_cases(self): self.assertTrue(validate_phone((021)234-5678)) self.assertTrue(validate_phone(234-5678)) def test_invalid_cases(self): self.assertFalse(validate_phone((02A)234-5678)) self.assertFalse(validate_phone(134-5678)) if __name__ __main__: unittest.main()4.3 测试覆盖率提升技巧使用边界值分析法补充用例前缀测试199、200、999、1000后缀测试999、1000、9999、10000组合测试有效地区码无效前缀有效后缀无效地区码有效前缀无效后缀国际化考虑不同国家的电话号码格式带国家码的情况如86-21-123456785. 从电话号码到复杂系统掌握了电话号码这个案例后可以将其扩展到更复杂的系统电商系统商品价格正数、最多两位小数库存数量非负整数用户注册密码强度规则邮箱格式验证API接口测试参数取值范围必填项验证最近在测试一个物流系统就用这个方法设计了运费计算模块的测试用例发现了3个边界值处理的bug。关键是要把每个输入条件都当成独立的维度来分析就像解魔方一样一层层拆解才能看到全貌。