[英]Running specific tests with TestNG programmatically
在执行测试时,我会填充一个failTests列表。 我想在套件完成时以编程方式重新运行这些测试。 根据TestNG文档,我实现了以下逻辑:
public void retrySuiteVirtXml(){
TestListenerAdapter tla = new TestListenerAdapter();
TestNG tng = new TestNG();
tng.addListener(tla);
XmlSuite suite = new XmlSuite();
suite.setName("Retry Suite");
for (ITestResult testResult : failedTests){
XmlTest xmlTest = new XmlTest();
xmlTest.setSuite(suite);
String newTestName = testResult.getName();
xmlTest.setName(newTestName);
List<XmlClass> xmlClasses = new ArrayList<>();
xmlClasses.add(new XmlClass(testResult.getTestClass().getName()));
xmlTest.setXmlClasses(xmlClasses);
xmlTest.getClasses().addAll(xmlClasses);
suite.addTest(xmlTest);
}
List<XmlSuite> suites = new ArrayList<>();
suites.add(suite);
tng.setXmlSuites(suites);
//tng.run();
tng.runSuitesLocally();
}
但是,此块将运行出现在失败测试类中的每个测试。 我无法弄清楚如何使TestNG仅运行失败的测试(列出failedTests)。
任何帮助都感激不尽。 谢谢。
我认为您将测试与方法混淆了。 您应该基于失败的测试来构建包含的方法。 您可以先尝试将类映射到其方法,然后将这些类添加到单个Test中。 下面的核心算法:
Map<String, List<XmlInclude>> classToMethodsMap = new HashMap<String, List<XmlInclude>>();
for (ITestResult testResult : failedTests){
//Create map of failed classes to methods
if(classToMethodsMap.get(testResult.getTestClass().getName()) == null){
List<XmlInclude> methods = new ArrayList<XmlInclude>();
methods.add(new XmlInclude(testResult.getMethod().getMethodName()));
classToMethodsMap.put(testResult.getTestClass().getName(),methods);
}else{
classToMethodsMap.get(testResult.getTestClass().getName()).add(new XmlInclude(testResult.getTestClass().getName()));
}
}
List<XmlClass> xmlClasses = new ArrayList<XmlClass>();
for(String className : classToMethodsMap.keySet()){
XmlClass xmlClassToAdd =new XmlClass(className);
xmlClassToAdd.setIncludedMethods(classToMethodsMap.get(className));
xmlClasses.add(xmlClassToAdd);
}
xmlTest.setXmlClasses(xmlClasses);
suite.addTest(xmlTest);
您可以在XmlClass
上使用setExcludedMethods
来过滤方法。
在没有特殊需要的情况下,只需一个XmlTest
就足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.