比如,我们想要获取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个,而且能覆盖所有场景。
  至此,我没什么好说的了。