这篇文章里,我要谈是什么的问题。我希望能够把这些理念重新建立起来,将价值观传播出去。我认为这比具体的技术更能够让人获益。
那么,什么样的用例是好用例?
2015年的时候,我很喜欢问高级工程师这个问题:“你认为什么样的用例是好的用例呢?”
我收获了非常多的回答:
- 能发现bug的用例是好用例
- 经过评审的用例是好用例
- 能让用户放心的用例是好用例
还有一些人遇到这个问题很迷茫,毕竟太空泛了,我会换个问题:“当你进行用例评审的时候,你认为这个用例应该被设计成什么样才能通过?”
此时的回答就更加具体了:
- 把需求覆盖全的用例
- 能够考虑到用户实际使用场景的用例
- 异常考虑全面的用例
上一个问题问的是判断的标准,下一个问题问的是判断的方法。我相信各位读者对这两个一定都有自己的回答,我也不想用自己的答案一统江湖,和上次一样,我们一起探索这个答案的过程更有趣。
2005年我刚刚参加工作,那时候作为一个菜鸟测试,我在网上学习了等价类和边界值的用例设计方法。现在大家都知道这是黑盒测试用例设计方法中的两个典型手段。但是那个时候我是如何设计的呢?
我们用测试最经典的题目,三角形来测试一下吧:
输入三个数值a,b,c作为三角形的三个角,系统将给出以下输出:
不是三角形
钝角三角形
直角三角形
锐角三角形
系统错误
请为该程序设计功能测试用例
这个题目相当经典了,经典到它成为了我五年来的面试题。但是好像和网上流传的不太一样。因为我实在是讨厌勾股定理带来的计算量,我就单纯的想看看这个人的设计思路,所以尽可能的简化了这个题的数学部分。
2005年的我是怎么做这道题的呢?
首先我会先按照直观的印象,弄一个简单的测试用例出来:
- a=90,b=10,c=80
然后把每一种可能的输出都赋予一个用例
- a=100,b=10,c=70
- a=80,b=20,c=80
- a=60,b=10,c=80
- a=x,b=10,c=80
接着我会苦思冥想,寻找到能把这个系统搞崩溃的手段,因为最高严重级别的bug就是崩溃,比如我会尝试一次输入很多很多字符,我会尝试很快速的多次输入等等。
当然,读到这里的读者朋友们估计已经笑了。这是非常简陋的方法,纯粹的穷举,几乎没有逻辑可言。我无意掩饰自己当年的笨拙,因为我觉得大家都是从这个状态走过来的。最初的我们就是依赖与生俱来的直觉,理性是慢慢学习和反思得来的。
我的面试者比我当年要强很多,一般来说,比较好的面试者会列出一系列约束条件:
- 三角形的内角和是180度
- 如果一个三角形内有一个角大于90度,它就是钝角三角形
- 如果一个三角形内有一个角等于90度,它就是直角三角形
- 如果输入的不是数字,那么系统将报错
然后,依据这些约束条件,他们会把输入分成多种,例如非数字,负数,小数,超过一百八十度的数等等,用正交法设计测试用例。
我的读者可以在这里做一做这道题,假如是你的话,你会如何设计这些用例?
拿出一张纸来,把你的答案写下来,因为后面你会需要面对它。
当然无论如何设计,都比我当年拍脑袋的搞法要好很多。
如果你已经形成了自己的设计,可以继续往下看了。
对于一个面试者来说,这一场面试将包括三部分,笔试部分是做上面那套题。事实上,如果有多个人都在做这道题,我甚至愿意他们互相讨论一下,因为比起他们现在写在纸上的内容,后面的两个部分才是我真正看重的。
一般来说,稍微受过测试训练的工程师都会切分好等价类,并针对边界值左右进行设计。我在拿到答案之后,我会与这位工程师面谈,谈的时候我会把他的答案还给他,然后问他一些问题。
各位亲爱的读者,你们也可以参与到这个过程中来,体验一下自我审视的感觉。看着这张纸,回答下面的问题:
请问,在给这个程序设计测试用例的过程中,你使用了哪些测试用例设计方法?
请详细说明你是如何使用的。
请问,这些用例够了吗?或者说,他们全面么?
如果你的回答是肯定的,就请你论述一下为什么你觉得他们是全面的。
如果你的回答是否定的,那么为什么你会把一个不全面的测试用例作为答案?
我使用了分割线来让大家思考我的问题,而不是直接浏览过来。当然,每个人都渴望知道答案,不喜欢作者卖关子,但是事实上进步并不来自于你听到了什么,而是来自于你反思了什么。
我在面试的过程中收获了千奇百怪的回答,包括高级测试工程师的答案。
对于初中级测试工程师,特指5年以下行业经验的同学们,他们的前两个问题无法自圆其说,面对第三个问题的表现是迷茫。
请问,在给这个程序设计测试用例的过程中,你使用了哪些测试用例设计方法?
等价类和边界值
这个回答是通用的,所有人的回答至少包括这两个,其他的还有什么错误推断之类的神鬼方法。
请详细说明你是如何使用的。
这个问题是大坑。大多数工程师在这个问题上的表现就是,说到一半卡住了。因为他发现自己写的内容和等价类边界值的方法完全不一致。
这说明什么?这说明他们平时并没有意识到,所谓测试用例设计方法对他们来说是两张皮,理论是完美的,实践是随意的。他们只是形式上采用了这两个方法,但是对这两个方法的标准用法并不熟悉,对这两个方法的意义和使用条件也完全不了解。
亲爱的你,是否也在这里卡住了呢?如果你也卡住了,恭喜你,你发现了一个机会点。后面我们会一起理清楚这两个方法,但是现在我们还有第三个问题要回答。
请问,这些用例够了吗?或者说,他们全面么?
如果你的回答是肯定的,就请你论述一下为什么你觉得他们是全面的。
如果你的回答是否定的,那么为什么你会把一个不全面的测试用例作为答案?
百分之百的人在这里会迷茫,我没遇见过不迷茫的。这也是我把这个文章放在第二篇的原因,大家仿佛只有在这个时候才第一次认真的思考这个问题,有些同学甚至以为自己听错了,需要我再重复一遍才能确认。