2014-09-11 12 views

Antwort

12

Es ist möglich, dies zu tun. Dafür benötigen Sie eine Implementierung von org.testng.ITestListener in testNg.xml als Zuhörer org.testng.ITestListener

<listeners> 
    <listener class-name="com.xyar.OnTestFailureClass" /> 
</listeners 

OnTestFailureClass muss implementieren registrieren.

onTestFailure Umsetzung wie folgt:

public void onTestFailure(ITestResult result) { 

     XmlSuite suite = new XmlSuite(); 
     suite.setName("rerunFailedTestClasses"); 
     XmlTest test = new XmlTest(suite); 
     test.setName(result.getTestName()); 
     List<XmlClass> classes = new ArrayList<XmlClass>(); 
     classes.add(result.getTestClass().getXmlClass()); 
     test.setXmlClasses(classes) ; 
     List<XmlSuite> suites = new ArrayList<XmlSuite>(); 
     suites.add(suite); 
     TestNG tng = new TestNG(); 
     tng.setXmlSuites(suites); 
     tng.run(); 

    } 

VORSICHT
Sie haben einen guten Grund müssen Sie den Test erneut ausführen. Die Wiederholung des Tests muss gewünscht sein, wenn Sie sicher sind, dass die zweite Iteration zum Erfolg führt. Wenn dies nicht der Fall ist, werden Sie eine Endlosschleife eingeben, in der fehlgeschlagene Tests weiterhin ausgeführt werden und fehlgeschlagen werden.

Wenn Sie einen Testfall unabhängig vom Testergebnis nur n-mal ausführen möchten, müssen Sie eine Logik für den Zähler in der onTestFailure-Methode erstellen.

----------------------------- UPDATE --------------- ---------------------

Entdeckt eine elegantere Lösung Implementieren Sie IRetryAnalyzer-Schnittstelle. Diese Schnittstelle wurde von TestNG speziell für den Zweck bereitgestellt, einen fehlgeschlagenen Test erneut zu versuchen. Es gab an, wie oft der Wiederholungsversuch durchgeführt werden musste.

import org.testng.IRetryAnalyzer; 
import org.testng.ITestResult; 

public class RetryAnalyzerImpl implements IRetryAnalyzer{ 
    private int retryCount = 0; 
    private int maxRetryCount = 3; 
    public boolean retry(ITestResult result) { 
     if(retryCount < maxRetryCount) 
      { 
       retryCount++; 
       return true; 
      } 
     return false; 
    } 
} 

Sie verwenden müssen folgende Anmerkungen

@Test(retryAnalyzer=Retry.class) 

jedoch zu vermeiden, dieses Attribut zu Ihren allen Testmethoden, den folgenden Ansatz zu nehmen, die durch diesen Link verwiesen wird ‚TestNG retryAnalyzer only works when defined in methods @Test, does not work in class' @Test

@BeforeSuite(alwaysRun = true) 
    public void beforeSuite(ITestContext context) { 
     for (ITestNGMethod method : context.getAllTestMethods()) { 
      method.setRetryAnalyzer(new RetryAnalyzerImpl()); 
     } 
    } 

Dies sollte Ihnen hoffentlich mit t estng-results.xml Bericht.

+0

ja, es funktioniert und lief gescheitert Klassen wieder, aber nur Problem, das ich hier konfrontiert, erstellt es keinen Bericht im Xml-Format ähnliche testng-result.xml für die erneut ausgeführten Klassen. Aus diesem Grund wird mein Jenkins Build gescheitert. –

2

Bitte sehen Sie sich an: http://testng.org/doc/documentation-main.html#rerunning Alle fehlgeschlagenen Tests sind in der separaten XML-Suite enthalten, die erneut ausgeführt werden kann.

<suite name="allSuites"> 
    <suite-files> 
    <suite-file path="yourSuite.xml" /> 
    <suite-file path="testng-failed.xml" /> 
    ... 
    </suite-files> 
</suite> 
+0

Sie sollten nicht manuell ausgeführt werden, können Sie eine Suite haben, besteht aus mehreren Suiten. Bitte sehen Sie eine aktualisierte Antwort. –

+0

Eine andere Möglichkeit ist eine Bat-Datei, die ausgeführt wird: 'java org.testng.TestNG yourSuite.xml' und dann ' java org.testng.TestNG testng-failed.xml' in diesem Fall 'testng-failed.xml' wird sicher erstellt und gestartet direkt nach der tatsächlichen Suite fertig –

Verwandte Themen