TestNG报告,如何快速识别Retry-d测试?

时间:2017-03-28 12:08:06

标签: java testng

您好:当@Test failsRetry发生时,TestNG中是否有直接的方法来区分已重试的测试和未重试的测试 - 例如通过NG上下文方法或变量?

  • 案例1:如果未重试测试,则1st test是未经重试的测试。
  • 案例2:如果测试已重试2次,则3rd test是未经重试的测试。

我发现的一些选项如http://www.seleniumeasy.com/testng-tutorials/retry-listener-failed-tests-count-update - 但想检查社区是否有其他方法和/或建议。

2 个答案:

答案 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

上要求提供该功能