下面这道题是ThougthWorks的面试题,是用来面试开发人员的,我们来看看作为测试人员,我们如何对这个需求进行测试,首先让我们来看一下题目:
面试题目:收银机
需求描述:
商店里进行购物结算时会使用收银机系统,这台收银机会在结算时根据客户的购物车中的商品和商店正在进行的优惠活动进行结算和打印购物小票。
已知商品信息包含:名称,数量单位,单价,类别和条形码(伪)。
已知我们可以对收银机进行设置,使之支持各种优惠。
我们需要实现一个名为打印小票的小模块,收银机会将输入的数据转换成一个JSON数据然后一次性传给我们这个小模块,我们将从控制台中输出结算清单的文本。
输入格式(样例):
[
'ITEM000001',
'ITEM000001',
'ITEM000001',
'ITEM000001',
'ITEM000001',
'ITEM000003-2',
'ITEM000005',
'ITEM000005',
'ITEM000005'
]
其中对'ITEM000003-2'来说,"-"之前的是标准的条形码,"-"之后的是数量。
当我们购买需要称量的物品的时候,由称量的机器生成此类条形码,收银机负责识别生成小票。
该商店正在对部分商品进行"买二赠一"的优惠活动和对部分商品进行95折的优惠活动。其中:
"买二赠一"是指,每当买进两个商品,就可以免费再买一个相同商品。
"95折"是指,在计算小计的时候按单价的95%计算每个商品。
每一种优惠都详细标记了哪些条形码对应的商品可以享受此优惠。
店员设置,当"95折"和"买二赠一"发生冲突的时候,也就是一款商品既符合享受"买二赠一"优惠的条件,又符合享受"95折"优惠的条件时,只享受"买二赠一"优惠。
要求写代码支持上述的功能,并根据输入和设置的不同,输出下列小票。
小票内容及格式(样例):
当购买的商品中,有符合"买二赠一"优惠条件的商品时:
***<没钱赚商店>购物清单***
名称:可口可乐,数量:3瓶,单价:3.00(元),小计:6.00(元)
名称:羽毛球,数量:5个,单价:1.00(元),小计:4.00(元)
名称:苹果,数量:2斤,单价:5.50(元),小计:11.00(元)
----------------------
买二赠一商品:
名称:可口可乐,数量:1瓶
名称:羽毛球,数量:1个
----------------------
总计:21.00(元)
节省:4.00(元)
**********************
当购买的商品中,没有符合"买二赠一"优惠条件的商品时:
***<没钱赚商店>购物清单***
名称:可口可乐,数量:3瓶,单价:3.00(元),小计:9.00(元)
名称:羽毛球,数量:5个,单价:1.00(元),小计:5.00(元)
名称:苹果,数量:2斤,单价:5.50(元),小计:11.00(元)
----------------------
总计:25.00(元)
**********************
当购买的商品中,有符合"95折"优惠条件的商品时
***<没钱赚商店>购物清单***
名称:可口可乐,数量:3瓶,单价:3.00(元),小计:9.00(元)
名称:羽毛球,数量:5个,单价:1.00(元),小计:5.00(元)
名称:苹果,数量:2斤,单价:5.50(元),小计:10.45(元),节省0.55(元)
----------------------
总计:24.45(元)
节省:0.55(元)
**********************
当购买的商品中,有符合"95折"优惠条件的商品,又有符合"买二赠一"优惠条件的商品时
***<没钱赚商店>购物清单***
名称:可口可乐,数量:3瓶,单价:3.00(元),小计:6.00(元)
名称:羽毛球,数量:6个,单价:1.00(元),小计:4.00(元)
名称:苹果,数量:2斤,单价:5.50(元),小计:10.45(元),节省0.55(元)
----------------------
买二赠一商品:
名称:可口可乐,数量:1瓶
名称:羽毛球,数量:2个
----------------------
总计:20.45(元)
节省:4.55(元)
**********************
在这里,我第一时间想到的是通过判定表的方式来解决这个测试问题,我们
输入条件:
C1:普通商品/称重商品。C1=T:普通商品;C1=F:称重商品。
C2:买二赠一的商品。C2=T:有买二赠一的商品;C2=F:无买二赠一的商品。
C3:95折的商品。C3=T:有95折的商品;C3=F:无95折的商品。
输出结果:
A1:无优惠购物清单。
A2:仅有买二赠一商品的购物清单。
A3:仅有95折商品的购物清单。
A4:既有买二赠一的商品又有95折的商品的购物清单。
我们用判定表来分析一下:
第1列与第5列合并;
第2列与第6列合并;
第3列与第7列合并;
第4列与第8列合并;
我们假设条形码信息'ITEM000001' 包含名称,数量单位,单价,类别,格式为'<名称><数量单位><单价><类别>',其中,类别=0:表示无优惠产品、类别=1:表示买二赠一的商品、类别=2:表示95折的商品、类别=3:既有买二赠一的商品又有95折的商品的购物清单。
于是我们得到一下四组测试输入数据
[
'<可口可乐><瓶><3.00><0>',
'<可口可乐><瓶><3.00><0>',
'<可口可乐><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<苹果><斤><5.50><0>'-2,
]
[
'<可口可乐><瓶><3.00><0>',
'<可口可乐><瓶><3.00><0>',
'<可口可乐><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<苹果><斤><5.50><2>'-2,
]
[
'<可口可乐><瓶><3.00><1>',
'<可口可乐><瓶><3.00><1>',
'<可口可乐><瓶><3.00><1>',
'<羽毛球><瓶><3.00><1>',
'<羽毛球><瓶><3.00><1>',
'<羽毛球><瓶><3.00><1>',
'<羽毛球><瓶><3.00><1>',
'<羽毛球><瓶><3.00><1>',
'<苹果><斤><5.50><0>'-2,
]
[
'<可口可乐><瓶><3.00><3>',
'<可口可乐><瓶><3.00><3>',
'<可口可乐><瓶><3.00><3>',
'<羽毛球><瓶><3.00><3>',
'<羽毛球><瓶><3.00><3>',
'<羽毛球><瓶><3.00><3>',
'<羽毛球><瓶><3.00><3>',
'<羽毛球><瓶><3.00><3>',
'<苹果><斤><5.50><3>'-2,
]
然后我们还可以根据经验来扩展我们的测试输入数据,看看系统的容错性:
1,空表单
[
]
2,同一种商品出现在两次
[
'<可口可乐><瓶><3.00><0>',
'<可口可乐><瓶><3.00><0>',
'<可口可乐><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<羽毛球><瓶><3.00><0>',
'<可口可乐><瓶><3.00><0>',
'<可口可乐><瓶><3.00><0>',
]
3,同一种名称商品单价不同
[
'<苹果><斤><5.50><3>'-2,
'<苹果><斤><5.00><3>'-2,
]
4,同一种名称商品数量单位不同
[
'<可口可乐><瓶><3.00><0>',
'<可口可乐><瓶><3.00><0>',
'<可口可乐><听><2.50><0>',
'<可口可乐><听><2.50><0>',
]
考虑到输入数据是条形码输入的,对于错误格式,长字符等特殊情况我们在这里不做处理
作者:顾翔
来源:51Testing软件测试网原创