java - TestNG Reporting,如何快速识别Retry-d Tests?

标签 java testng

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

  • 情况 1:如果未重试测试,则第一个测试 是尚未重试的测试。
  • 情况 2:如果某个测试已重试 2 次,则第 3 次测试 是尚未重试的测试。

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

最佳答案

你可以尝试这样的事情。这个想法基本上是检索与特定测试方法关联的重试分析器实例,然后查询其重试计数。如果其重试计数大于零,则重试该方法。

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();
        }
    }
}

关于java - TestNG Reporting,如何快速识别Retry-d Tests?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43069150/

相关文章:

java - 在堆栈计算器中计算负数

java - TestNG Eclipse插件: How to change the name prefix of methods for [New -> TestNG Class]?

JAVA - Jpeg 到 Jpeg 隐写术

使用密码时Java POI异常: The part/xl/styles. xml无法保存在流中

java - 如何使用作为 uberjar 部署的库?

android - Android 中的警告

java - 同一类的第一次 @Test 失败后,所有测试都会自动失败

eclipse - 在执行 selenium 测试期间 testng.xml 未从 pom.xml 运行

java - 如何在 Java 数据驱动测试中传递数组作为参数?

java - java Scanner 不在新实例上采用 nextLine 的问题