前言
有时候我们希望失败用例可以重新运行N次,已避免出现因网络不稳定之类的情况导致的失败,那么如何实现呢,有如下方法:
1、直接重运行失败用例
在每次用例运行完成后在用例结果输出目录会有叫做testng-failed.xml
的文件,此文件内部就是失败用例,需要注意的是此文件内部将含有所有被依赖的方法,运行方法如下:
java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs testng.xml
或者
java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs test-outputs\testng-failed.xml
2、重写接口实现自动重运行
前面那个方法是在全部运行完毕后重运行失败用例,那么这个方法就可以实现自动运行失败用例,主要步骤为如下两步:
- 重写一个接口org.testng.IRetryAnalyzer;
- 为@Test标注的文件添加监听器,例如
@Test(retryAnalyzer = LocalRetry.class)
或者直接在xml中添加监听器;
如下为一个范例:
package com.demo.test.testng;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class MyIRetryAnalyzer implements IRetryAnalyzer{
private int retryCount = 0;
private static final int maxRetryCount = 3;
public boolean retry(ITestResult result) {
if (retryCount < maxRetryCount) {
retryCount++;
return true;
}
return false;
}
}
用例如下:
package com.demo.test.testng;
import org.testng.Assert;
import org.testng.annotations.Test;
public class ListenerTest {
@Test
public void test1() {
System.out.println("test1");
}
@Test(retryAnalyzer=MyIRetryAnalyzer.class)
public void test2() {
System.out.println("test2");
Assert.assertFalse(true);
}
}
运行该用例,结果为:
[RemoteTestNG] detected TestNG version 6.10.0
[TestNG] Running:
C:\Users\dufei\AppData\Local\Temp\testng-eclipse-832342186\testng-customsuite.xml
test1
test2
test2
test2
test2
PASSED: test1
FAILED: test2
实际应用的时候,我们如果想单独为某个用例设定这个失败重运行则可以入上图那样为@Test
注解添加一个(retryAnalyzer=MyIRetryAnalyzer.class)
,如果我们想直接为所有用例添加这个重运行该怎么办呢?直接将这个添加为监听器?显然是不行的,因为这个接口并非监听器,不能加入,但是我们可以用监听器IAnnotationTransformer,将重运行的接口实现类加入进来,范例如下:
public class OverrideIAnnotationTransformer implements IAnnotationTransformer{
@Override
public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
IRetryAnalyzer iRetryAnalyzer= iTestAnnotation.getRetryAnalyzer();
if(iRetryAnalyzer==null){
iTestAnnotation.setRetryAnalyzer(OverrideIReTry.class);
}
}
}
备注:这个监听器的作用就是修改@Test
注解的设定值。
而后再将这个监听类加入到xml的监听器中,譬如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="casual">
<listeners>
<listener class-name="reTry.OverrideIAnnotationTransformer"></listener>
</listeners>
<test name="test">
<classes>
<class name="reTry.ReTryTest">
<methods>
<include name="test1"/>
<include name="test2"/>
</methods>
</class>
</classes>
</test>
</suite>
这样就可以为所有包含的用例添加这个失败重运行了,至于这个最大重试次数,可以改为从外部配置传入,譬如yaml文件或者properties文件。