测试用例的自动生成技术
作者:网络转载 发布时间:[ 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个,而且能覆盖所有场景。
至此,我没什么好说的了。

sales@spasvo.com