经常有还未完全入门的童鞋在群里问,自动化测试结果该怎么验证?整个自动化测试写下去完全不清楚该怎么验证,什么时候验证……其实这里的验证就是结果对比验证。自动化测试的结果对比环节是整个测试的关键,因为这将最终反映这条测试用例的成功与否,失败的用例需要算法或者人工回溯的,那么我们如何做测试预期与实际结果对比呢?
一、对比思路
所谓的测试结果对比,无非就是拿实际测试结果与预期结果对比,比如某条测试用例需要对比页面的标题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,这就完成了,写完发现简单问题讲清楚反而比说复杂问题还更麻烦。。。