首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在retryAnalyzer之后将TestNG DefaultSuite结果发送到Maven Surefire插件

如何在retryAnalyzer之后将TestNG DefaultSuite结果发送到Maven Surefire插件
EN

Stack Overflow用户
提问于 2014-10-02 00:06:05
回答 2查看 1.7K关注 0票数 2

我确实搜索了很多,这是我得到的最接近的答案,但不能解决我的问题。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执行:

代码语言:javascript
复制
============================================
DefaultTest
Total tests run: 4, Failures: 2, Skips: 0
============================================

============================================
DefaultSuite
Total tests run: 2, Failures: 0, Skips: 0
============================================

MAVEN执行:

代码语言:javascript
复制
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上?

EN

回答 2

Stack Overflow用户

发布于 2015-03-18 22:54:18

终于明白了。我使用以下代码:

ListenerApadter

代码语言:javascript
复制
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

代码语言:javascript
复制
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监听程序的地方,该监听程序具有自己的计数器。

代码语言:javascript
复制
<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>
票数 0
EN

Stack Overflow用户

发布于 2015-03-29 18:50:27

代码语言:javascript
复制
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());
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26145666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档