测试用例的自动生成技术
作者:网络转载 发布时间:[ 2012/12/28 10:35:52 ] 推荐标签:
比如,我们想要获取user的预期取值范围,代码可以这么写:
public BaseUserDO getExpectUser(String nick){
//给取值范围里的nick分组,只有在这个组里面的用户才存在,否则均返回null
String[] exsitUserNicks= {Nick.b2bNick.value, Nick.subB2BNick.value};
if(ArrayUtil.contains(exsitUserNicks, nick)){
//根据nick查出用户信息返回
ResultDO callback = uicReadServiceClient.getUserInfoByNick(nick);
Assert.assertTrue(callback.getErrMsg(), callback.isSuccess());
Assert.assertNotNull(callback.getModule());
return callback.getModule();
}
return null;
}
代码中“Nick.b2bNick.value”,Nick是一个枚举,方便输入数据值域归类:
public enum Nick{
blankNick(""),
nullNick(null),
notExsitNick("1233211"),
tbNick("leizang_test"),
b2bNick("leizang_btob_1"),
subB2BNick("leizang_btob_1:subnick01");
String value;
Nick(String value){
this.value= value;
}
}
类似地,我们需要编写如下方法:
中间对象 | 被依赖对象 | 编写获取方法(省去类型) |
user | nick | getExpectUser(nick) |
ruleCode | user, wwLimitData | getExpectRuleCode(user, wwLimitData) |
isFrozen | user, wwLimitData | getExpectIsFrozen(user, wwLimitData) |
suspended | user, isFrozen | getExpectSuspended(user, isFrozen) |
punishData | user, punishData, suspended | getExpectPunishData(user, punishData, suspended) |
mmpData | user, mmpData | getExpectMmpData(user, mmpData) |
这样,我们产出结果的预期数据有了,终的比对形式应该是这样子,resultMap为接口返回实际结果:
public void verify(String nick, String wwLimitData,
String punishData, String mmpData, Map resultMap){
BaseUserDO expectUser= getExpectUser(nick);
String expectRuleCode= getExpectRuleCode(expectUser, wwLimitData);
boolean expectIsFrozen= getExpectIsFrozen(expectUser, wwLimitData);
String expectSuspended= getExpectSuspended(expectUser, expectIsFrozen);
String expectPunishData= getExpectPunishData(expectUser, punishData, expectSuspended);
String expectMmpData= getExpectMmpData(expectUser, mmpData);
Assert.assertEquals("user", expectUser, resultMap.get("user"));
Assert.assertEquals("ruleCode", expectRuleCode, resultMap.get("ruleCode"));
Assert.assertEquals("suspended", expectSuspended, resultMap.get("suspended"));
Assert.assertEquals("punishData", expectPunishData, resultMap.get("punishData"));
Assert.assertEquals("mmpData", expectMmpData, resultMap.get("mmpData"));
}
到这里我们已经解决了用例自动生成的两个难点:输入数据、预期数据。如果你是个容易满足的人,那么上面所述的已经够用了。但如果你是个贪得无厌的人,那么肯定还记得我们上面留下的问题:1080个用例,仅仅一个小功能会生成如此多的用例,要是把产品线如此复杂的功能都拿来用那岂不是要把硬盘玩爆?更谈不上执行了。当然不能这么玩,前面我们已经说了,1080个用例里面是有水分的,场景重复的太多,得兽兽身啊!好吧,下面开始我们的减肥之旅。
3、用例瘦身
根据依赖的传递性,找出对原始数据的依赖:
中间对象 | 被依赖对象 | 被依赖原始对象 |
user | nick | nick |
ruleCode | user, wwLimitData | nick, wwLimitData |
isFrozen | user, wwLimitData | nick, wwLimitData |
suspended | user, isFrozen | nick, wwLimitData |
punishData | user, punishData, suspended | nick, punishData, wwLimitData |
mmpData | user, mmpData | nick, mmpData |
过滤中间过程对象,如isFrozen,子集合并,后,整理出“输出对象”对“原始数据”的依赖关系:
输出对象 | 依赖对象 |
user, ruleCode, suspended, punishData | nick, wwLimitData, punishData |
mmpData | nick, mmpData |
由此可以看出,runCode,suspended的输出跟mmpData无关,同样mmpData的输出跟punishData、wwLimitData也无关。于是我们的用例个数可以由原来的6*6*5*2*3= 1080个,精简为6*6*2+ 6*3= 89个,而且能覆盖所有场景。
至此,我没什么好说的了。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11