我想重新运行失败的测试用例的失败测试类,以便我可以反驳所有之前的依赖测试用例。
尝试使用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();
我不建议出于您的目的自动重新运行完整的课程,尽管这不太可能正常工作(即不会损坏测试结果等)。
您可以使用 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();
}
}
}