[英]TestNG retry test in multithreaded environment
我一直在使用 TestNG 重試機制如下 -
public class TestRetryAnalyzer implements IRetryAnalyzer {
public static final int MAX_RETRY_COUNT = 3;
private static final AtomicInteger count = new AtomicInteger(MAX_RETRY_COUNT);
public static void resetCount() {
count.set(MAX_RETRY_COUNT);
}
public int getCount() {
return count.get();
}
private boolean isRetryAvailable() {
return (count.get() > 0);
}
@Override
public boolean retry(ITestResult result) {
boolean retry = false;
if (isRetryAvailable()) {
System.out.println("Going to retry test case: " + result.getMethod() + ", " + (((MAX_RETRY_COUNT - count.get()) + 1)) + " out of " + MAX_RETRY_COUNT);
retry = true;
count.decrementAndGet();
}
return retry;
}
}
public class TestRetryListener implements IAnnotationTransformer {
@Override
public void transform(final ITestAnnotation annotation, final Class testClass, final Constructor testConstructor,
final Method testMethod) {
IRetryAnalyzer retryAnalyzer = annotation.getRetryAnalyzer();
if (retryAnalyzer == null) {
annotation.setRetryAnalyzer(TestRetryAnalyzer.class);
}
}
和測試 -
public class SimpleTest {
private int count = 0;
@Test
public void test() {
count++;
if (count % 3 != 0) {
Assert.fail("Injected Failure");
}
count = 0;
}
和 testng.xml 文件 -
<suite name="Suite1" verbose="1">
<listeners>
<listener class-name="main.java.TestRetryListener" />
<listener class-name="org.uncommons.reportng.HTMLReporter" />
<listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
</listeners>
<test name="Sample" >
<classes>
<class name="main.java.SimpleTest" />
</classes>
</test>
<test name="Sample2" >
<classes>
<class name="main.java.SimpleTest" />
</classes>
</test>
<test name="Sample3" >
<classes>
<class name="main.java.SimpleTest" />
</classes>
</test>
<test name="Sample4" >
<classes>
<class name="main.java.SimpleTest" />
</classes>
</test>
<test name="Sample5" >
<classes>
<class name="main.java.SimpleTest" />
</classes>
</test>
當我只運行一個測試時,重試機制運行良好(1 次通過,2 次跳過)。 但是當我運行上面 testng.xml 文件中提到的 5 個測試時,它們開始失敗。 我是否會在沒有並行運行測試的情況下遇到並發問題? 我該如何擺脫它?
我正在使用 testNG 6.9.10
TestNG 框架僅調用一次 TestRetryListener,因此堆中將只存在一個 TestRetryAnalyzer 實例。 多個測試共享實例變量“count”(AtomicInteger 類的實例)。 對於每個測試,它不會重置為 3,這意味着 AtomicInteger 對象僅實例化一次,並且 TestRetryAnalyzer 類使用相同的引用。
為了克服上述問題,我們必須在每次測試后將計數重置為 3。 為此,您必須進行以下更改
public class SimpleTest {
private int count = 0;
@Test
public void test() {
count++;
System.out.println("Test Count ... " + count);
if (count % 4 != 0) {
Assert.fail("Injected Failure");
}
count = 0;
}
@AfterTest
public void afterTest() {
TestRetryAnalyzer.resetCount();
}
}
公共類 TestRetryAnalyzer 實現了 IRetryAnalyzer {
private static int MAX_RETRY_COUNT = 3;
private static AtomicInteger count = new AtomicInteger(MAX_RETRY_COUNT);
public static void resetCount() {
count.set(MAX_RETRY_COUNT);
}
private boolean isRetryAvailable() {
return (count.intValue() > 0);
}
@Override
public boolean retry(ITestResult result) {
boolean retry = false;
if (isRetryAvailable()) {
retry = true;
count.decrementAndGet();
System.out.println("Retry Analyzer count is : " + count);
}
return retry;
}
}
希望這有幫助:)
我正在使用ThreadLocal
實例來處理這個問題。 該解決方案完美運行。
public class RetryAnalyzer implements IRetryAnalyzer {
private ThreadLocal<Integer> count = ThreadLocal.withInitial(() -> 0);
private static final int maxTry = TestRunner.getRunConfig().getRerun();
private static final Logger logger = LogManager.getLogger(RetryAnalyzer.class);
@Override
public synchronized boolean retry(ITestResult result) {
if (!result.isSuccess()) { //Check if test not succeed
if (count.get() < maxTry) { //Check if maxtry count is reached
count.set(count.get() + 1); //Increase the maxTry count by 1
result.setStatus(ITestResult.FAILURE); //Mark test as failed
logger.debug("Now going to retry " + result.getMethod().getMethodName());
logger.debug("Retry count is " + count);
return true; //Tells TestNG to re-run the test
} else {
result.setStatus(ITestResult.FAILURE); //If maxCount reached,test marked as failed
count.set(0); //Reset count to 0 for next set of tests
logger.debug("Reset the retry count for " + result.getMethod().getMethodName());
}
} else {
result.setStatus(ITestResult.SUCCESS); //If test passes, TestNG marks it as passed
}
return false;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.