以编程方式使用TestNG运行特定测试

时间:2016-03-20 21:19:01

标签: java automated-tests testng

在执行测试时,我填充了失败的测试列表。 我希望在套件完成时以编程方式重新运行这些测试。 在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只运行失败的测试(List failedTests)。

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:4)

我认为你用测试方法混淆了测试。您应该根据失败的测试构建包含的方法。您可以先尝试为其方法创建类的映射,然后将类添加到单个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);

答案 1 :(得分:0)

您可以setExcludedMethods使用XmlClass来过滤方法。

没有特别需要,只有一个XmlTest就足够了。