如何使用Testng重新运行失败的测试用例的整个测试类?

问题描述 投票:0回答:1

我想重新运行失败的测试用例的失败测试类,以便我可以反驳所有之前的依赖测试用例。

尝试使用ITestListener和IRetryAnalyzer,使用onTestFailure类我以失败的无限循环结束。

我已将这部分代码添加到 Listener 类中的 onTestFailure 类中 -

    XmlSuite suite = new XmlSuite();
    suite.setName("rerunFailedTestClasses");
    XmlTest test = new XmlTest(suite);
    test.setName(result.getMethod().getDescription());
    List<XmlClass> classes = new ArrayList<XmlClass>();
    classes.add(new XmlClass(result.getTestClass().getName()));
    test.setXmlClasses(classes);
    List<XmlSuite> suites = new ArrayList<XmlSuite>();
    suites.add(suite);
    TestNG tng = new TestNG();
    tng.setXmlSuites(suites);
    tng.run();
java selenium-webdriver testng
1个回答
0
投票

我不建议出于您的目的自动重新运行完整的课程,尽管这不太可能正常工作(即不会损坏测试结果等)。

您可以使用 TestNG IReporter 监听器来收集一组至少有一个测试失败的类。 然后使用收集的类创建单独的 .xml 文件。它将类似于“testng-failed.xml”,但使用类而不是单独的方法。
如果需要,您可以使用侦听器/参数扩展生成的文件。

package testlisteners;

import org.testng.*;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class FailedClassesAnalyzer implements IReporter {


@Override
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
    Set<String> failedClasses = new HashSet<>();
    for (ISuite suite : suites) {
        for (ISuiteResult result : suite.getResults().values()) {
            ITestContext testContext = result.getTestContext();
            if (testContext.getFailedTests().size() > 0) {
                for (ITestResult failedTest : testContext.getFailedTests().getAllResults()) {
                    failedClasses.add(failedTest.getTestClass().getName());
                }
            }
        }
    }

    if (!failedClasses.isEmpty()) {
        generateXmlFile(failedClasses);
    }
}


private void generateXmlFile(Set<String> failedClasses) {
    XmlSuite suite = new XmlSuite();
    suite.setName("FailedTestsSuite");

    XmlTest test = new XmlTest(suite);
    test.setName("FailedTests");

    List<XmlClass> classes = new ArrayList<>();
    for (String failedClass : failedClasses) {
        classes.add(new XmlClass(failedClass));
    }
    test.setXmlClasses(classes);

    try (FileWriter fileWriter = new FileWriter("custom-failed-tests.xml")) {
        fileWriter.write(suite.toXml());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}
© www.soinside.com 2019 - 2024. All rights reserved.