当测试脚本有一定数量的情况下,每次执行完所有的测试脚本会发现或多或少的测试脚本执行失败了,失败主要是两种原因一种是源程序bug,另外一种是测试脚本由于各方面的原因执行失败了(如脚本稳定性、网络环境、机器连接问题等),如果是后一种原因造成的通常再次执行就会测试脚本就会通过,为了减少后期分析自动化执行结果的时间很有必要添加失败重跑逻辑。正好TestNG提供了个监听器给我们使用,我们现在来具体看下怎么来实现和使用这个监听器。
可以先新建一个类如Retry,让其实现IRetryAnalyzer,然后复写retry方法,在这个方法里定义重跑的次数,具体如下所示:
package appium.common;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class Retry implements IRetryAnalyzer {
//定义重跑的次数
int retryCount = 1;
int index = 1;
//return true的时候会重跑,return false则不会
public boolean retry(ITestResult iTestResult) {
if(index <= retryCount){
index++;
return true;
}
return false;
}
}
上面我们定义了重跑的次数为1。
接着还需要新建一个类如RerunListener,然后让其实现IAnnotationTransformer接口,然后设置重试的处理类为上面新建的Retry类,具体如下:
package appium.listeners;
import appium.common.Retry;
import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class RerunListener implements IAnnotationTransformer {
public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
IRetryAnalyzer iRetryAnalyzer = iTestAnnotation.getRetryAnalyzer();
if(iRetryAnalyzer == null){
//设置重试的类为Retry
iTestAnnotation.setRetryAnalyzer(Retry.class);
}
}
}
这时候还需要去要执行的suite文件里添加这个监听器的实现类,如下所示:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<listeners>
<listener class-name="appium.listeners.TestListener"/>
<listener class-name="appium.listeners.RerunListener"/>
</listeners>
<test name="Regression1">
<classes>
<class name="appium.testcases.login.LoginPermissionCheck"/>
<class name="appium.testcases.versioncheck.VersionCheck"/>
</classes>
</test>
</suite>
同样执行下这个文件,看下VersionCheck会不会执行两次(因为这个类会执行失败,如果重跑机制生效就会执行两次)
执行完确实可以看到VersionCheck的test方法被执行了两次,如下所示: