您好:当@Test fails
和Retry
发生时,TestNG中是否有直接的方法来区分已重试的测试和未重试的测试 - 例如通过NG上下文方法或变量?
1st test
是未经重试的测试。3rd test
是未经重试的测试。我发现的一些选项如http://www.seleniumeasy.com/testng-tutorials/retry-listener-failed-tests-count-update - 但想检查社区是否有其他方法和/或建议。
答案 0 :(得分:2)
你可以尝试这样的事情。我们的想法是基本上检索与特定测试方法关联的重试分析器实例,然后查询其重试计数。如果其重试次数大于零,则重试该方法。
import org.testng.Assert;
import org.testng.IRetryAnalyzer;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
@Listeners(IdentifyRetriedTests.IdentifyingListener.class)
public class IdentifyRetriedTests {
private static AtomicInteger counter = new AtomicInteger(0);
private static AtomicInteger anotherCounter = new AtomicInteger(0);
@Test(retryAnalyzer = Retry.class)
public void hello() {
if (counter.incrementAndGet() == 3) {
Assert.assertTrue(true);
} else {
Assert.fail();
}
}
@Test(retryAnalyzer = Retry.class)
public void anotherHello() {
if (anotherCounter.incrementAndGet() == 5) {
Assert.assertTrue(true);
} else {
Assert.fail();
}
}
public static class IdentifyingListener extends TestListenerAdapter {
@Override
public void onTestSuccess(ITestResult tr) {
IRetryAnalyzer retry = tr.getMethod().getRetryAnalyzer();
if (retry instanceof Retry) {
//Check if the retry analyser's retry count was greater than zero. If yes, then its a retried method
if (((Retry) retry).getRetryCount() > 0) {
tr.setAttribute("retried", true);
}
}
}
@Override
public void onFinish(ITestContext testContext) {
Set<ITestResult> results = new HashSet<>();
results.addAll(testContext.getFailedTests().getAllResults());
results.addAll(testContext.getPassedTests().getAllResults());
for (ITestResult result : results) {
if (result.getAttribute("retried") != null) {
System.err.println(result.getMethod().getMethodName() + "() was retried");
}
}
}
}
public static class Retry implements IRetryAnalyzer {
private AtomicInteger retryCount = new AtomicInteger(0);
private static int maxRetryCount = 10;
public boolean retry(ITestResult result) {
return retryCount.getAndIncrement() < maxRetryCount;
}
int getRetryCount() {
return retryCount.get();
}
}
}
答案 1 :(得分:1)
目前,没有简单的方法可以知道测试是否是重试。
也许你可以收集testng监听器中的每个run方法,然后你可以确定是否已经在run方法列表中找到了该方法。
顺便说一下,您应该在http://github.com/cbeust/testng/issues 上要求提供该功能