重跑失败场景
1.要添加两个文件
背景:因为这里只是想单独展示失败的重跑的案例,所以先暂时把app这块的运行注释掉,只跑一个简单的demo,就一个简单类,类中就3个测试方法,失败重跑的原理是,运行方法是成功状态,就不重跑,如果是失败的,就在继续执行方法,直到他设置的最大重跑次数时就停止,要先添加这个一个类,实现IRetryAnalyzer 这个方法,以下就是一个retry 类
失败重跑代码展示
package until; import org.apache.log4j.Logger; import org.testng.IRetryAnalyzer; import org.testng.ITestResult; public class retry implements IRetryAnalyzer{ private static Logger logger = Logger.getLogger(retry.class); private int retryCount = 1; private static int maxRetryCount = 3; #控制失败跑几次 public boolean retry(ITestResult result) { if (retryCount < maxRetryCount) { retryCount++; return true; } return false; }
2.这个类RetryListener.Java主要是实现IAnnotationTransformer 方法
package until; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import org.apache.tools.ant.taskdefs.Retry; import org.testng.IAnnotationTransformer; import org.testng.IRetryAnalyzer; import org.testng.annotations.ITestAnnotation; public class RetryListener implements IAnnotationTransformer { @Override public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { IRetryAnalyzer retry = annotation.getRetryAnalyzer(); if (retry == null) { annotation.setRetryAnalyzer(retry.class); #注意这里的类名一定要写对 } } }
3.在xml文件中配置监听器, 监听的是RetryListener这个类
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="SuiteName" > <listeners> <listener class-name="until.RetryListener" /> </listeners> <test name="version" preserve-order="true"> <classes> <class name="com.test.appuimtest.rosewholePC"> <methods> <include name="chooseNew"/> </methods> </class> </classes> </test> </suite>
目前的目录结构是这样,但是关键是是retry.java, RetryListener.java, rosewholepc.java:
3.实现:
在rosewholepc中写入的方法就1个为
查看执行效果,运行了三次
以为这样就完了,其实没有,这个时候执行你会发现他会记录你3次结果数据,但是其实我们只想记录最后1次的数据,因为做UI你会发现,因为网络原因会导致第一次失败,第二次就正常了,所以我们增加重跑就可以减少脚本的误报的情况,我们只要采取最后一次结果就好了,
4.解决这个问题我还需要那在TestngListener这个类里面的finnish监听里面加上这段代码就可以了
执行类中的Xml文件加上这两个监听,RetryListener失败重跑
执行效果
有人中提到是去实现ITestListener接口, IestListenerAdapter 已经实现 ITestListener,并且提供了一些有用的方法,比如分别获取所有成功失败跳过三种测试结果的测试方法的方法,并且 ITestListner 中有很多方法而 TestListenerAdapter 已给出了默认实现。因此,继承 TestListenerAdapter 后,便只需关注需要修改的方法。因为我们最开始用到的也是TestListenerAdapter,所以在onFinish中直接添加以上代码就可以了
@Override public void onFinish(ITestContext testContext) { super.onFinish(testContext); //失败后重跑,记录最后一次结果 Iterator<ITestResult> listOfFailedTests = testContext.getFailedTests().getAllResults().iterator(); while (listOfFailedTests.hasNext()) { ITestResult failedTest = listOfFailedTests.next(); ITestNGMethod method = failedTest.getMethod(); if (testContext.getFailedTests().getResults(method).size() > 1) { listOfFailedTests.remove(); } else { if (testContext.getPassedTests().getResults(method).size() > 0) { listOfFailedTests.remove(); } } } }
我在添加了2个案例
执行效果如下