2014-09-30 5 views

Antwort

28

Sie können es nicht aus der XML-Datei heraus tun, aber in der @Test-Annotation können Sie ein invocationCount-Attribut mit der Häufigkeit hinzufügen, mit der es ausgeführt werden soll. Es würde herauskommen, wie diese vielen Tests in dem Bericht laufen.

z.

@Test(invocationCount = 10) 
public void testCount() {..} 

Sie haben am Ende geschlossen geschweifte Klammer verpasst, so eine kleine Korrektur.

+0

Das ist schade, weil es für einige Anwendungsfälle sehr wichtig ist, XML statt Code zu konfigurieren. Zum Beispiel: Ich habe einen funktionalen Testfall purchaseXYZ(). In meiner Funktionstestsuite möchte ich es nur einmal laufen lassen, um zu sehen, ob etwas kaputt ist. In meiner Performance-Test-Suite möchte ich es 100 Mal ausführen, um durchschnittliche Latenz zu erhalten. Daher muss ich in der Lage sein, die Anzahl der Aufrufe aus XML anzugeben, die im Code nicht fest codiert sind. –

+1

Warum machen Sie dann nicht einfach einen zweiten Test - einen für den Funktionstest und einen für den Unit-Test? – anon58192932

+0

@ anon58192932 Während ich sehen kann, dass das funktionieren würde, scheint es eher wie ein Workaround als eine Lösung. –

0

Wenn Sie nicht mit Sprint dagegen haben, können Sie diese Klasse erstellen:

package somePackage; 

import org.junit.Ignore; 
import org.junit.runner.Description; 
import org.junit.runner.notification.RunNotifier; 
import org.junit.runners.BlockJUnit4ClassRunner; 
import org.junit.runners.model.FrameworkMethod; 
import org.junit.runners.model.InitializationError; 
import org.junit.runners.model.Statement; 
import org.springframework.test.annotation.Repeat; 

public class ExtendedRunner extends BlockJUnit4ClassRunner { 

    public ExtendedRunner(Class<?> klass) throws InitializationError { 
     super(klass); 
    } 

    @Override 
    protected Description describeChild(FrameworkMethod method) { 
     if (method.getAnnotation(Repeat.class) != null 
       && method.getAnnotation(Ignore.class) == null) { 
      return describeRepeatTest(method); 
     } 
     return super.describeChild(method); 
    } 

    private Description describeRepeatTest(FrameworkMethod method) { 
     int times = method.getAnnotation(Repeat.class).value(); 

     Description description = Description.createSuiteDescription(
      testName(method) + " [" + times + " times]", 
      method.getAnnotations()); 

     for (int i = 1; i <= times; i++) { 
      description.addChild(Description.createTestDescription(
       getTestClass().getJavaClass(), "[" + i + "] " 
         + testName(method))); 
     } 
     return description; 
    } 

    @Override 
    protected void runChild(final FrameworkMethod method, RunNotifier notifier) { 
     Description description = describeChild(method); 

     if (method.getAnnotation(Repeat.class) != null 
       && method.getAnnotation(Ignore.class) == null) { 
      runRepeatedly(methodBlock(method), description, notifier); 
     } 
     super.runChild(method, notifier); 
    } 

    private void runRepeatedly(Statement statement, Description description, 
      RunNotifier notifier) { 
     for (Description desc : description.getChildren()) { 
      runLeaf(statement, desc, notifier); 
     } 
    } 

} 

Dann in den eigentlichen Test:

package somePackage; 

import *.ExtendedRunner; 

import org.junit.Ignore; 
import org.junit.runner.RunWith; 
import org.springframework.test.annotation.Repeat; 

@Ignore 
@RunWith(ExtendedRunner.class) 
public class RepeatedTest{ 
    @Repeat(value N) 
    public void testToBeRepeated() { 

    } 
} 

wobei N die Anzahl der Male ist wollen Sie den Test wiederholen.

+0

Ich benutze Testng und Datenprovider. was soll ich machen? jetzt manipuliere ich die Größe von ojects arrays. denkst du, dass es eine gute Idee ist? –

+0

Ich denke du meinst "Wenn es dir nichts ausmacht mit ** Spring ** ...." Bitte beachten Sie, dies ist eine Frage zu TestNG, nicht zu JUnit. –

1

Sie können es nicht aus dem XML, aber es kann mithilfe von @DataProvider Annotation in TestNG erreicht werden.

Hier ist ein Beispielcode:

/* Since Data provider for this test method returns 2D array of size 3x1, 
this test method will run 3 times **automatically** with 1 parameter every time. */ 
@Test(dataProvider="URLprovider") 
private void notePrice(String url) { 
    driver.get(url); 
    System.out.println(driver.getTitle()); 
} 

// It will return a 2D array of size 3x1 
@DataProvider(name="URLprovider") 
private Object[][] getURLs() { 
    return new Object[][] { 
    {"https://www.google.co.in/"}, 
    {"http://www.gmail.com/"}, 
    {"http://stackoverflow.com/"} 
    }; 
} 
3

testng eine Methode aufweist. Sie können diese Methode verwenden und Ihr Testfall mehrmals ausgeführt:

@Test(invocationCount = 100) 

public void testCount() { 

} 
+0

Können Sie bitte Ihre Antwort bearbeiten und erklären, was Sie meinen? Wie es jetzt ist, kann ich nicht verstehen, ob Sie eine neue Antwort geben oder [niharika_neos Antwort] kommentieren (http://stackoverflow.com/a/26134824/3982001). Wenn du etwas fragen willst, solltest du es in einer neuen Frage tun, nicht hier. Dies ist eine Q & A-Site, kein Forum. Vielen Dank! –

+0

danke für die Bestätigung. –

0

Ich weiß ziemlich spät zur Party, aber wenn Ihr Ziel Bericht für jeden Lauf zu erreichen ist, dann können Sie TestNG Zuhörer IAnnotationTransformer

Code versuchen snippet

public class Count implements IAnnotationTransformer { 

    @Override 
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { 
     // TODO Auto-generated method stub 
     annotation.setInvocationCount(numberOfTimesTOExecute); 
    } 

xml Schnipsel

<listeners> 
<listener class-name="multiple.Count"></listener> 

+0

Das scheint ziemlich gut zu sein. Aber können Sie die numberOftimesTOExecute-Variable aus der Datei testng.xml erhalten? –

+0

Es ist möglich, einen "Service Loader" zu erstellen. Siehe Antwort auf diese Frage: https://stackoverflow.com/questions/45593426/testng-set-invocationcount-globally – Andrejs

2

Keine der Antworten gibt dem Benutzer die Fähigkeit, die Anzahl der Aufrufe aus der testng-Datei zu erhöhen. Diese Lösung basiert auf der DataProvider-Lösung von gaurav25.

class TestClass() { 
    int invocationCount; 

    @Parameters({ "invocationCount" }) 
    @BeginClass 
    void BeginClass(@Optional("1") String invocationCount) { 
     this.invocationCount = Ingeter.parse(invocationCount) 
    } 

    // It will return a 2D array of size 3x1 
    @DataProvider(name="URLprovider") 
    private Object[][] getURLs() { 
     ArrayList<Object []> obj = new ArrayList<>(3 * this.invocationCount); 

     for(int iCount = 0; iCount < this.invocationCount; ++iCount) { 
      list.add(new Object[] {"https://www.google.co.in/"}); 
      list.add(new Object[] {"http://www.gmail.com/"}); 
      list.add(new Object[] {"http://stackoverflow.com/"}); 
     } 

     return list.toArray(); 
    } 

    /* Since Data provider for this test method returns 2D array of size 
    (3*invocationCount)x1, this test method will run 3*invocationCount 
    times **automatically** with 1 parameter every time. */ 
    @Test(dataProvider="URLprovider") 
    private void notePrice(String url) { 
     driver.get(url); 
     System.out.println(driver.getTitle()); 
    } 
} 

Jetzt können Sie ändern, wie viele Testsets durch die Testfunktion mit dieser testng.xml Datei ausführen lassen:

<suite name="ESFService" verbose="1" parallel="methods" thread-count="1" data-provider-thread-count="10" > 
    <test name="Basic"> 
     <classes> 
      <class name="TestClass"> 
       <parameter name="invocationCount" value="5"/> 
      </class> 
     </classes> 
    </test> 
</suite>