经常有还未完全入门的童鞋在群里问,自动化测试结果该怎么验证?整个自动化测试写下去完全不清楚该怎么验证,什么时候验证……其实这里的验证是结果对比验证。自动化测试的结果对比环节是整个测试的关键,因为这将终反映这条测试用例的成功与否,失败的用例需要算法或者人工回溯的,那么我们如何做测试预期与实际结果对比呢?
  一、对比思路
  所谓的测试结果对比,无非是拿实际测试结果与预期结果对比,比如某条测试用例需要对比页面的标题title,那么我们首先需要知道预期结果是什么(有人说我不知道预期结果是什么,那么你先去熟悉应用),比如预期title:“个人主页”,然后在测试用例的实现中获取本次测试的实际结果,再进行结果对比,实际tilte与预期title一致,那么本次验证通过(pass),不一致,则本次验证不通过(failed)。

  二、对比方法
  具体在测试用例代码中我们基于Junit或TestNG提供的Assert类提供的系列方法去对比,具体选择Junit还是TestNG取决于你的测试项目引用的是哪种。那么又有个问题,如果你使用的是Junit或者TestNG框架提供的Assert类去断言,那么在对比失败后,用例会中断,不会继续执行了,可是我们通常不希望被中断,这个验证点断言失败,我还想继续下面的测试,验证其他的测试点,那么我们直接使用Junit或TestNG提供的断言方法是没有完全符合需求了。这要如何做呢?还好断言中断的异常我们可以通过try-catch来捕获,具体实现方法,我自己封装了一个Assert类,直接看代码吧,说这么多还真不如代码来的实在(talk is cheap. show me the code),看代码吧。
public class Assert {
public static final String STARTSWITH = "startsWith";
public static final String ENDSWITH = "endsWith";
public static final String CONTAINS = "contains";
public static boolean assertSame(Object actual, Object expected, String msg, String tag){
boolean isMatch = false;
if(assertEquals(actual,expected,false)){
BaseCase.log.i("实际"+ msg +":""+actual+"" ,跟期望"+ msg +":""+expected+"" 相匹配");
return true;
}
String text = "包含于";
switch (tag){
case Assert.STARTSWITH:
isMatch = actual.toString().startsWith(expected.toString());
text = "开始于";
break;
case Assert.ENDSWITH:
isMatch = actual.toString().endsWith(expected.toString());
text = "结束于";
break;
case Assert.CONTAINS:
isMatch = actual.toString().contains(expected.toString());
text = "包含于";
break;
default:
break;
}
if(isMatch){
BaseCase.log.i("实际"+ msg +":""+actual+"" ,"+ text +" 期望"+ msg +":""+expected+""");
return true;
}else{
BaseCase.log.e("实际"+ msg +":""+actual+"" ,"+ text +" 期望"+ msg +":""+expected+""");
return false;
}
}
public static boolean assertEquals(Object actual, Object expected, String msg){
try {
org.junit.Assert.assertEquals(actual, expected);
BaseCase.log.i("实际"+ msg +":""+actual+"" ,跟期望"+ msg +":""+expected+"" 相匹配");
return true;
} catch (Error e) {
BaseCase.log.e("实际"+ msg +":""+actual+"" ,跟期望"+ msg +":""+expected+"" 不匹配");
return false;
}
}
}
  代码封装了2个断言方法,模糊对比与等于,其他方法大家可以自己试着实现。
  使用很简单了,也举个小例子吧,兼顾基础的同学~
//在你的测试方法中直接调用,对比结果
@Test
public void testTitle(){
//此处省略部分实现
String actualTitle = getTitle();
String exceptedTitle = "XXXXX";
Assert.assertSame(actualTitle,  exceptedTitle, "标题", Assert.STARTSWITH );
Assert.assertEquals(actualTitle,  exceptedTitle, "标题");
}
  ok,这完成了,写完发现简单问题讲清楚反而比说复杂问题还更麻烦。。。