本节书摘来自华章计算机《Web测试囧事》一书中的第3章,第3.1节,作者 黄勇 雷辉 徐潇 杨雪敏,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
第3章
功能测试:测试实践篇
前两章我们介绍了在功能测试中使用特定的开发和测试技术手段如何避免问题,那除此之外还有没有什么别的方式可以同样起到预防作用呢?
答案是肯定的,例如本章我们介绍的通过引入某些测试实践来避免和预防Bug。现在让我们一起来看看这些故事吧。
3.1 修改充值金额范围遗漏的产品Bug
产品中有一个允许用户自助为自己账户充值的功能(见图3-1)。充值金额的范围被设定在5~50元之间,低于或者高于这个金额都会被系统自动变成最接近的允许值:如输入3,因为小于最小值5,则系统自动更新为5;如果输入80,因为大于最大值50,所以系统自动变成50。
对于这个功能,小蔡详细设计了测试用例,覆盖了所有可能的情况:
1)输入非数字,系统不识别,不能进行充值;
2)输入错误/不存在的充值账号,系统不能正确充值;
3)输入正确的充值账号,输入负值,系统不能正确充值;
4)输入正确的充值账号,输入0,系统自动更正成5,之后可以正确充值;
5)输入正确的充值账号,输入小于5的数值,系统自动更正成5,之后可以正确充值;
6)输入正确的充值账号,输入大于50的数值,系统自动更正成50,之后可以正确充值;
7)输入正确的充值账号,输入等于5,系统能正确充值;
8)输入正确的充值账号,输入等于50,系统能正确充值;
9)输入正确的充值账号,输入大于5、小于50的数值,系统能正确充值。
此外,小蔡还考虑到虽然这个功能并不复杂,但是需要涉及和银行方面的对接,所以还设计了针对银行系统的集成测试,由于使用的是真实的银行系统接口,每次测试会真实扣除账户中的钱,所以在测试时修改了服务器上充值的范围,缩小了每次允许充值的数目范围,修改后为0.1~10。
上面的测试用例就变成了:
1)输入非数字,系统不识别,不能进行充值;
2)输入错误/不存在的充值账号,系统不能正确充值;
3)输入正确的充值账号,输入负值,系统不能正确充值;
4)输入正确的充值账号,输入0,系统自动更正成0.1,之后可以正确充值;
5)输入正确的充值账号,输入小于0.1的数值,系统自动更正成0.1,之后可以正确充值;
6)输入正确的充值账号,输入大于10的数值,系统自动更正成10,之后可以正确充值;
7)输入正确的充值账号,输入等于0.1,系统能正确充值;
8)输入正确的充值账号,输入等于10,系统能正确充值;
9)输入正确的充值账号,输入大于0.1、小于10的数值,系统能正确充值。
设计好测试用例之后,小蔡去找老牛评审。老牛最初感觉第二次修改的测试用例和第一次的用例是基本等价的,但是当经验老到的老牛在实际页面上使用了几分钟后,一下就发现了问题所在,随即问小蔡:“更改充值范围后的测试用例真的等价于原始的充值用例吗?”
本来小蔡还觉得挺有信心的,但是被老牛这么一问,自己也拿不定主意了。老牛看她没有意识到所出的问题,又细心解释道:“你看输入框上有一个功能, 当用户输入的数字不在允许的范围内会做自动纠错,也就是说系统会自动把这个超出范围的数字改为属于允许范围内的数字。但是问题出在每次当用户按一下键盘数字键后,这个自动纠错功能都会起作用,这可能会造成用户无法输入他原本想输入的数字的Bug 。”
老牛顿一下,接着说:“例如,当你把充值范围改为0.1~10后开始测试,如果用户输入15这个数字,输入第一个字符1时,1属于允许范围内,因此可以输入,当用户输入15这个数字的第二个字符5的时候,系统会判断15这个数字不在允许范围内,因此系统会自动把这个数字改为10,整个过程符合预期没有问题。”
“但是如果我们把充值范围恢复到5~50后再进行测试,假如用户同样输入15这个数字,当用户输入15这个数字的第一个字符1的时候,系统会判断这个字符小于5,因此系统开始自动纠错,自动把1变成5,因此从用户输入第一个字符就预示着最终结果是错误的。这时候,如果再输入15这个数字的第二个字符5,输入的数值就会变成55,系统会把55自动改为50。因此当我们把充值范围恢复到原来的5~50后,用户是无法输入15这个数字的。”
这还真是个严重的问题啊!幸好老牛的经验丰富,能看出两个测试用例集并不是等价的。这样给小蔡上了一课:在测试用例本身的设计时,也需要考虑到数值对于测试用例的等价类划分是否一致。
对于这个问题,小蔡首先添加了一条测试用例:
输入正确的充值账号,输入大于10、小于15的数值,系统能正确充值。
其他为避免这个问题采取的解决方案如下。
1)当用户点击到充值数额的输入框之外以后,也就是焦点在输入框之外的时候,才对充值数值的范围进行判断,这样避免了用户输入的过程对于数值判断逻辑的影响;
2)同时小蔡也扩大了充值数值的范围,改为从0.1到15,保证10以上的数值也可以成功充值。