引言
今天分享的这道面试题也是我曾经在笔试中用到过的。 当初大概有四十人左右曾经做过这道题,没有一个人给出了正确答案,让我没有想到的是,其中做得最接近正确答案的,是一名大四出来实习的小女生。
有很多面试官喜欢问:在软件测试的各个环节中,你觉得哪个环节是最重要的?
在我看来,如何分析分析需求并且转化为测试范围是排在首位的。理解需求难吗?很多测试从业者都有一种感觉,只要给足够的时间,理解需求这个事儿并不难。但我们常常面临的情况是,任务重时间紧,导致我们常常在没有足够理解需求的情况下进行测试,这时候我们还能有信心说测试过的软件产品符合上线标准吗?
这种情况下,有一套快速理解需求并转化为测试范围的方法就显得尤为重要。而作为面试官,自然也希望能在面试过程中判断求职者是否具备这种能力。这也是我当初把这道题作为笔试题的原因。
这道题并非我原创,当初在将它列为我的笔试题的时候有过这样的考虑:求职者是否在其他地方看到过这道题?如果看到过,对其他求职者是否不公平?如果因为他们提前训练过,他们的面试结果是否会对我做出录用决策产生影响?
一番考虑之后,我仍然决定把它列入笔试题。一方面是因为软件测试从业者中,喜欢看书学习的少,这意味着大多数求职者以前碰到这道题的概率很小,这就保证对大多数人是公平的。反过来说,如果他们之前看到过这道题,也可能意味着这名求职者喜欢学习,有上进心,这也是我希望看到的。况且,我可以通过提问更多的问题来判断求职者是否是有真材实料,减少这一道题的结果可能对我的误导。简单来说就是,求职者回答的好,并不代表求职者一定善于分析需求分解需求,但回答的不好,那一定是在这方面存在不足。另一方面,善于学习的人并不多。那个资料中给出的参考思路在我看来并非最优,如果原封不动的把那个参考思路搬过来,我会考虑这名求职者是否是一个只会“读死书”的人。
面试题
案例分析(给出分析过程和测试点):
有一个饮料自动售货机(处理单价为5角钱)软件。其规格说明如下:若投入5角钱或1元钱的硬币,押下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。若售货机没有零钱找,则一个显示〖零钱找完〗的红灯亮,这时在投入1元硬币并押下按钮后,饮料不送出来而且1元硬币也退出来;若有零钱找,则显示〖零钱找完〗的红灯灭,在送出饮料的同时退还5角硬币。
当初资料中是按照“因果图测试法”给出的思路,具体如下:
1) 分析需求,列出原因和结果
原因:
1.售货机有零钱找
2.投入1元硬币
3.投入5角硬币
4.押下橙汁按钮
5.押下啤酒按钮
结果:
21.售货机〖零钱找完〗灯亮
22.退还1元硬币
23.退还5角硬币
24.送出橙汁饮料
25.送出啤酒饮料
2)画出因果图,如图所示。所有原因结点列在左边,所有结果结点列在右边。建立中间结点,表示处理的中间状态。中间结点:
11. 投入1元硬币且押下饮料按钮
12. 押下〖橙汁〗或〖啤酒〗的按钮
13. 应当找5角零钱并且售货机有零钱找
14. 钱已付清
3)转换成判定表:
4) 在判定表中,阴影部分表示因违反约束条件的不可能出现的情况,删去。第16列与第32列因什么动作也没做,也删去。最后可根据剩下的16列作为确定测试用例的依据。
我的看法
当初的作者是用这道题来介绍“因果图测试法”,是为了使用这个需求来训练测试方法的使用。但如果抛开这个限制,我们是否有其他思考方式呢?
显然是有的。在上一次的分享中,我们提到“分类”的方法对测试人员来说很重要,对这道题其实也可以使用分类的方法来思考,比如:
有零钱找, 且有饮料(红灯灭):
1. 投入1元硬币,押下〖橙汁〗的按钮,送出橙汁,并退回五角钱。
2. 投入1元硬币,押下〖啤酒〗的按钮,送出啤酒,并退回五角钱。
3. 投入5角硬币,押下〖橙汁〗的按钮,送出橙汁。
4. 投入5角硬币,押下〖啤酒〗的按钮,送出啤酒。
有零钱找,但无饮料(红灯灭)。
1. 投入1元硬币,押下〖橙汁〗的按钮,不能送出饮料。
2. 投入1元硬币,押下〖啤酒〗的按钮,不能送出饮料。
3. 投入5角硬币,押下〖橙汁〗的按钮,不能送出饮料。
4. 投入5角硬币,押下〖啤酒〗的按钮,不能送出饮料。
无零钱找,有饮料(〖零钱找完〗的红灯亮):
1. 投入1元硬币,押下〖橙汁〗的按钮,饮料不送出来而且1元硬币也退出来。
2. 投入1元硬币,押下〖啤酒〗的按钮,饮料不送出来而且1元硬币也退出来。
3. 投入5角硬币,押下〖橙汁〗的按钮,送出橙汁。
4. 投入5角硬币,押下〖啤酒〗的按钮,送出啤酒。
无零钱找,无饮料(〖零钱找完〗的红灯亮):
1. 投入1元硬币,押下〖橙汁〗的按钮,饮料不送出来而且1元硬币也退出来。
2. 投入1元硬币,押下〖啤酒〗的按钮,饮料不送出来而且1元硬币也退出来。
3. 投入5角硬币,押下〖橙汁〗的按钮,不出饮料。
4. 投入5角硬币,押下〖啤酒〗的按钮,不出饮料。
总结:
相比“因果图”测试法,这种方法的有点和缺点是什么呢?
如果是你,你会怎么选择?
你能否想到其他的思路来完成这道题呢?