Testing TestNG-套件完成后,如何重新运行失败的测试

Testing TestNG-套件完成后,如何重新运行失败的测试,testing,automated-tests,testng,Testing,Automated Tests,Testng,在TestNG中完成套件后,如何重新运行失败的测试。 使用RetryAnalyzer,我可以在失败的测试用例之后立即重新运行失败的测试用例,但不能在套件完成之后 我要求这样做的原因是: 我的测试用例在20多个线程上并行运行,我的一些测试系统在这个负载上表现不好,因此在负载之后立即重试并没有多大帮助 但是我们通过重新运行testNG-failed.xml来重试失败的测试用例,这些用例被传递。目前,我们正在重新运行testNG-failed.xml,但它为我们创建了2个报告和许多其他问题。我们可以通

在TestNG中完成套件后,如何重新运行失败的测试。 使用RetryAnalyzer,我可以在失败的测试用例之后立即重新运行失败的测试用例,但不能在套件完成之后

我要求这样做的原因是: 我的测试用例在20多个线程上并行运行,我的一些测试系统在这个负载上表现不好,因此在负载之后立即重试并没有多大帮助


但是我们通过重新运行testNG-failed.xml来重试失败的测试用例,这些用例被传递。目前,我们正在重新运行testNG-failed.xml,但它为我们创建了2个报告和许多其他问题。我们可以通过RetryAnalyzer或testNG中的任何其他方式在不重新运行testNG-failed.xml的情况下实现类似的功能吗

您可以创建
suiteListener
,在测试套件运行后显示失败的测试用例,如下所示,以获取所有上下文的所有失败测试用例

public class suiteListener implements ISuiteListener {


    @Override
public void onStart(ISuite suite) {

}

     @Override
        public void onFinish(ISuite suite) {

              System.out.println("suite finished");
            final Map<java.lang.String,ISuiteResult>  res = suite.getResults()       
                    for (ISuiteResult r : res.values()) {
                             context =  r.getTestContext()  ;           
                    Iterator<ITestResult> failedTestCases =context.getFailedTests().getAllResults().iterator();
                    while (failedTestCases.hasNext()) {
                     System.out.println("failedTestCases...");
                     ITestResult failedTestCase = failedTestCases.next();
                     ITestNGMethod method = failedTestCase.getMethod();
                    java.lang.String testName =    failedTestCase.getName();

                       System.out.println("failed method.."+ method);   
                       System.out.println("failed testName.."+ testName);   
                    }
                }
然后,您可以通过创建一个虚拟类,简单地利用方法以编程方式运行测试

像这样修改套件,并在
testng.xml

import org.testng.IAlterSuiteListener;
import org.testng.xml.XmlPackage;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;

import java.util.Collections;
import java.util.List;

public class SimpleSuiteAlterer implements IAlterSuiteListener {
    @Override
    public void alter(List suites) {
        XmlSuite suite = suites.get(0);
        XmlTest xmlTest = new XmlTest(suite);
        xmlTest.setName("test123");

         XmlClass xmlClass = new XmlClass("yourClass");
        List<XmlInclude> includeMethods = new ArrayList<>();
        includeMethods.add(new XmlInclude("your_method1"));
         includeMethods.add(new XmlInclude("your_method2"));

         //add more methods dynamically from your other listener

         xmlClass.setIncludeMethods(includeMethods);
         xmlTest.setXmlClasses(classes) ;
    }
}
import org.testng.IAlterSuiteListener;
导入org.testng.xml.XmlPackage;
导入org.testng.xml.XmlSuite;
导入org.testng.xml.XmlTest;
导入java.util.Collections;
导入java.util.List;
公共类SimpleSuite实现了IAlterSuiteListener{
@凌驾
公共无效更改(列表套件){
XmlSuite=suites.get(0);
XmlTest XmlTest=新的XmlTest(套件);
setName(“test123”);
XmlClass XmlClass=新的XmlClass(“您的类”);
List includeMethods=new ArrayList();
includeMethods.add(新的xmlclude(“您的方法1”);
includeMethods.add(新的xmlclude(“您的方法2”);
//从其他侦听器动态添加更多方法
setIncludeMethods(includeMethods);
setXmlClasses(类);
}
}

我认为运行此测试套件将运行一个单独的套件,我将得到另一份报告。或者它将更新现有的测试套件和测试用例结果?@Nikunj Aggarwal我在上面编辑过回答您的问题。请别忘了标记答案和upvoteok让我分析一下你的方法,然后再投票并接受答案。谢谢你的邀请help@NikunjAggarwal我有同样的问题。在哪里可以使用RetryAnalyzer解析?
import org.testng.IAlterSuiteListener;
import org.testng.xml.XmlPackage;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;

import java.util.Collections;
import java.util.List;

public class SimpleSuiteAlterer implements IAlterSuiteListener {
    @Override
    public void alter(List suites) {
        XmlSuite suite = suites.get(0);
        XmlTest xmlTest = new XmlTest(suite);
        xmlTest.setName("test123");

         XmlClass xmlClass = new XmlClass("yourClass");
        List<XmlInclude> includeMethods = new ArrayList<>();
        includeMethods.add(new XmlInclude("your_method1"));
         includeMethods.add(new XmlInclude("your_method2"));

         //add more methods dynamically from your other listener

         xmlClass.setIncludeMethods(includeMethods);
         xmlTest.setXmlClasses(classes) ;
    }
}