如果我在testng 6.14.3版本上运行测试,则重新启动删除的测试。 如果我在testng 7.0.0版本上运行测试,则删除的测试不会重新启动。
public class RetryAnalyzer implements IRetryAnalyzer {
private int count = 0;
private static int maxTry = 2;
@Override public boolean retry(ITestResult iTestResult) {
if (!iTestResult.isSuccess()) {
if (count < maxTry) {
count++;
iTestResult.setStatus(ITestResult.FAILURE);
iTestResult.getTestContext().getFailedTests().removeResult(iTestResult);
return true;
} else {
iTestResult
.setStatus(ITestResult.FAILURE);
}
} else {
iTestResult
.setStatus(ITestResult.SUCCESS);
}
return false;
}
}
public class AnnotationTransformer implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor,
Method testMethod) {
annotation.setRetryAnalyzer(RetryAnalyzer.class);
}
}
我的听众:
<listeners>
<listener class-name="package.AnnotationTransformer"/>
</listeners>
答案 0 :(得分:0)
我已经尝试了您的实现,并且对我来说非常完美(使用了TestNG 7.0.0)。确保导入和类路径正确(仔细检查<listener class-name="package.AnnotationTransformer"/>
)。
另外,请考虑以下事项:
boolean retry()
接口的IRetryAnalyzer
方法。 TestNG RetryAnalyzerCount
类已经定义了根据计数器返回结果(布尔)的逻辑(它也实现了IRetryAnalyzer
接口)。因此,最好重用RetryAnalyzerCount
的代码(与您的逻辑相同): a)通过设置RetryAnalyzer
类和
b)通过重写TestNG abstract boolean retryMethod(ITestResult var1);
类中的RetryAnalyzerCount
,如果测试失败,则返回正布尔值(true
)。
import java.util.concurrent.atomic.AtomicInteger;
import org.testng.ITestResult;
import org.testng.util.RetryAnalyzerCount;
import lombok.extern.slf4j.Slf4j;
/**
* Used by RetryListener (or AnnotationTransformer) to avoid the declaration of 'retryAnalyzer' in each @Test annotation
*/
@Slf4j
public class RetryAnalyzer extends RetryAnalyzerCount {
private static final int MAX_RETRY_ATTEMPTS = 3;
private AtomicInteger counter = new AtomicInteger(1); //used only for logging purposes
public RetryAnalyzer() {
setCount(MAX_RETRY_ATTEMPTS);
}
@Override
public boolean retryMethod(ITestResult result) {
// log example: [15/04/20 13:31] WARN [RetryAnalyzer] RETRY failed test 'displaySearchResultForValidInput' (1 out of 3 times)
String methodName = result.getMethod().getMethodName();
log.warn("RETRY failed test '{}' ({} out of {} times)",
methodName,
this.counter.getAndIncrement(),
MAX_RETRY_ATTEMPTS);
// enough is only the return statement
return true;
}
}
AnnotationTransformer
不变。<listeners>
文件中的.xml
标签包含指向侦听器(AnnotationTransformer
)的正确路径。 或简化所有操作:
a)通过从TestNG AnnotationTransformer
文件中删除<listeners>
和.xml
和
b)通过在RetryAnalyzer
中为TestNG设置自定义@BeforeSuite
(!!!不是@BeforeMethod
,这会导致无限循环)
@BeforeSuite
void beforeSuiteSetUp(ITestContext testsContext) {
setCustomRetryAnalyzer(testsContext);
}
private void setCustomRetryAnalyzer(ITestContext testsContext) {
for (ITestNGMethod method : testsContext.getAllTestMethods()) {
method.setRetryAnalyzerClass(RetryAnalyzer.class);
}
}