我确实搜索了很多,这是我得到的最接近的答案,但不能解决我的问题。TestNG retrying failed tests doesn't output the correct test results
但是我需要把上面的问题从TestNG扩展到Maven.请帮帮忙。
我的项目堆栈: TestNG,Maven surefire插件,Maven。我从命令行"mvn clean compile test“运行测试。我正在使用一个重试分析器重新运行失败的测试,这些测试正在第二次通过。我已经能够使用CustomListener来更新存储在TestNG的testcontext中的结果(基于stackoverflow中的解决方案)。当我以TestNG套件运行测试时确认了这一点。
但是当我运行"mvn clean compile test“时,所有的重试都被算作单独的测试,构建总是失败。如何让TestNG只将最终的套件结果发送到Maven Surefire插件?
TESTNG执行:
============================================
DefaultTest
Total tests run: 4, Failures: 2, Skips: 0
============================================
============================================
DefaultSuite
Total tests run: 2, Failures: 0, Skips: 0
============================================MAVEN执行:
Tests run: 4, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.292 sec <<< FAILURE!
Results :
Failed tests:
test1(foo.TestClass1)
test1(foo.TestClass1)
Tests run: 4, Failures: 2, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------由于重试,生成已通过。如何将TestNG重试套件的结果反映到Maven上?
发布于 2015-03-18 22:54:18
终于明白了。我使用以下代码:
ListenerApadter
public class MyTestListenerAdapter extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result) {
if (result.getMethod().getRetryAnalyzer() != null) {
MyRetryAnalyzer retryAnalyzer = (MyRetryAnalyzer)result.getMethod().getRetryAnalyzer();
if(retryAnalyzer.isRetryAvailable()) {
result.setStatus(ITestResult.SKIP);
} else {
result.setStatus(ITestResult.FAILURE);
}
Reporter.setCurrentTestResult(result);
}
}
@Overrride
public void onFinish(ITestContext context) {
Iterator<ITestResult> failedTestCases =context.getFailedTests().getAllResults().iterator();
while (failedTestCases.hasNext()) {
System.out.println("failedTestCases");
ITestResult failedTestCase = failedTestCases.next();
ITestNGMethod method = failedTestCase.getMethod();
if (context.getFailedTests().getResults(method).size() > 1) {
System.out.println("failed test case remove as dup:" + failedTestCase.getTestClass().toString());
failedTestCases.remove();
} else {
if (context.getPassedTests().getResults(method).size() > 0) {
System.out.println("failed test case remove as pass retry:" + failedTestCase.getTestClass().toString());
failedTestCases.remove();
}
}
}
}
}RetryAnalizer
public class MyRetryAnalyzer implements IRetryAnalyzer {
private static int MAX_RETRY_COUNT = 3;
AtomicInteger count = new AtomicInteger(MAX_RETRY_COUNT);
public boolean isRetryAvailable() {
return (count.intValue() > 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.intValue() + 1) + " out of " + MAX_RETRY_COUNT);
retry = true;
count.decrementAndGet();
}
return retry;
}
}POM.xml -> Surefire配置:
这是您应该配置"overwrite“surefire监听程序的地方,该监听程序具有自己的计数器。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<suiteXmlFiles><suiteXmlFile>${basedir}/testng.xml</suiteXmlFile></suiteXmlFiles>
<properties>
<property>
<name>listener</name>
<value>Utils.MyTestListenerAdapter,Utils.MyRetryAnalizer</value>
</property>
</properties>发布于 2015-03-29 18:50:27
Some suit info is incorrect, but maven surefire works properly
maven-surefire-plugin 2.16
testng 6.8.8
// ===== InvokedMethodListener =====
import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ITestResult;
public class InvokedMethodListener implements IInvokedMethodListener {
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
RetryAnalyzer retryAnalyzer = (RetryAnalyzer)testResult.getMethod().getRetryAnalyzer();
if (retryAnalyzer == null || retryAnalyzer.isFailed()) {
return;
}
if (testResult.getStatus() == ITestResult.FAILURE) {
testResult.setStatus(ITestResult.SUCCESS);
}
}
}
// ===== RetryAnalyzer =====
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import org.testng.Reporter;
public class RetryAnalyzer implements IRetryAnalyzer {
private int count = 0;
private int maxCount = 2;
@Override
public boolean retry(ITestResult result) {
if (!result.isSuccess()) {
if (count < maxCount) {
count++;
return true;
}
}
return false;
}
public boolean isFailed() {
return count >= maxCount;
}
}
// ===== BaseTest =====
@Listeners({ ..InvokedMethodListener.class })
public abstract class BaseTest {
...
@BeforeSuite(alwaysRun = true)
public void beforeSuite(ITestContext context) {
for (ITestNGMethod method : context.getAllTestMethods()) {
method.setRetryAnalyzer(new RetryAnalyzer());
}
}
}https://stackoverflow.com/questions/26145666
复制相似问题