Stellen Sie die Verzögerungszeit für jeden <Test> in TestNG ein

Dec 14 2020

Zuerst als Info : Ich habe jede @Testin eine andere Klasse eingeordnet (also hat natürlich jede Klasse nur 1 @TestAnmerkung).

Eigentlich ist mein Ziel, dieselbe Klasse mit anderen Parametern erneut ausführen zu wollen, aber ich möchte vorher zuerst eine andere Klasse ausführen.

Ich habe versucht, viele Referenzen zu finden, bei denen TestNG die Wiederholung einer Klassen- oder @TestMethodenanmerkung in einer nicht zulässt <test>. Die bereitgestellte Wiederholung ist eine invocationCountFunktion, die ich sehe invocationCount, aber ich kann mein Ziel nicht erreichen, invocationCountweil diese Funktion a gleichzeitig wiederholt @Testund ich dann eine andere ausführen kann @Test.

public class SimpleTest1 {
    @Test
    @Parameters({"acc"})
    public void historyTransfer(String acc) {
        System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
    }
}
public class SimpleTest2 {
    @Test
    @Parameters({"senderAcc", "beneficiaryAcc", "amount"})
    public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
        System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
    }
}

Ich stelle mir vor, wie unten zu laufen:

<suite name="Suite">
    <test name="My Test" >
        <classes>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="11111"></parameter>
            </class>
            <class name="com.SimpleTest2">
                <parameter name="senderAcc" value="11111"></parameter>
                <parameter name="beneficiaryAcc" value="22222"></parameter>
                <parameter name="amount" value="100"></parameter>
            </class>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="22222"></parameter>
            </class>
        </classes>
    </test>
</suite>

Die obige Konfiguration verlief jedoch nicht wie geplant, da die zweite SimpleTest1nicht ausgeführt wurde.

Dann habe ich versucht, es in einem separaten <test>Format wie unten und Erfolg auszuführen, aber ich habe jeweils ein neues Problem mit der Verzögerungszeit <test>.

Führen Sie mehrere <test>seriell (nicht parallel) wie folgt aus:

<suite name="Suite">
    <test name="My Test1" >
        <classes>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="11111"></parameter>
            </class>
        </classes>
    </test>
    <test name="My Test2" >
        <classes>
            <class name="com.SimpleTest2">
                <parameter name="senderAcc" value="11111"></parameter>
                <parameter name="beneficiaryAcc" value="22222"></parameter>
                <parameter name="amount" value="100"></parameter>
            </class>
        </classes>
    </test>
    <test name="My Test3" >
        <classes>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="22222"></parameter>
            </class>
        </classes>
    </test>
</suite>

TestNG Maven-Abhängigkeit:

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.0.0</version>
    <scope>compile</scope>
</dependency>

Surefire:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <suiteXmlFiles>
            <suiteXmlFile>testng.xml</suiteXmlFile>
        </suiteXmlFiles>
      </configuration>
</plugin>

IDE: Eclipse (Version: 2018-09 (4.9.0))

Betriebssystem: macOS Mojave (Version 10.14.6)

Ausgabe :

[RemoteTestNG] detected TestNG version 7.0.0
22-12-2020 21:59:32
22-12-2020 21:59:47
22-12-2020 21:59:57

===============================================
Suite
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================

Aber nachdem der erste <test>beendet ist, gibt es eine Verzögerung von ungefähr 10 Sekunden vor dem nächsten <test>Lauf sowie dem nächsten Test.

Hinweis : Ich dachte, dies sei ein Problem mit der IDE (ich verwende Eclipse), aber das war es nicht. Ich habe versucht, es auf zwei Arten über die IDE und die Befehlszeile auszuführen, und habe das gleiche Ergebnis zu diesem Verzögerungsproblem erzielt.

Über die Befehlszeile mit diesem Befehl:

mvn clean test -Dsurefire.suiteXmlFiles=testng.xml

Gibt es eine Konfiguration, um die oben genannte Verzögerungszeit zu reduzieren?

Antworten

2 juherr Dec 23 2020 at 19:36

Erstens ist eine Suite kein Testplan (könnte übrigens eine gute Funktionsanforderung sein), sondern nur eine Möglichkeit, Tests auszuwählen. Dies bedeutet, dass Sie keine Abhängigkeit zwischen Tests definieren können. Aus diesem Grund funktioniert es nicht, dieselbe Testklasse zu haben (sie sollte fehlschlagen oder unterschiedliche Instanzen erstellen).

Nach meinem Verständnis besteht der beste Weg darin, Ihre eigene Logik und deren Integration in das Testframework zu trennen:

  1. Entwerfen Sie Ihre Helfer- / Fixture-Klassen nach Ihren Wünschen:

_

public class SimpleClass1 {
  public void historyTransfer(String acc) {
    System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
  }
}

public class SimpleClass2 {
  public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
    System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
  }
}
  1. Definieren Sie die Klassen für die Integration in das Testframework

_

public class SimpleTest {
  @Test
  @Parameters({"acc"})
  public void step1(String acc) {
    (new SimpleClass1()).historyTransfer(acc);
  }

  @Test(dependsOnMethods = {"step1"})
  @Parameters({"senderAcc", "beneficiaryAcc", "amount"})
  public void step2(String senderAcc, String beneficiaryAcc, String amount) {
    (new SimpleClass2()).transfer(acc);
  }

  @Test(dependsOnMethods = {"step2"})
  @Parameters({"acc"})
  public void step3(String acc) {
    (new SimpleClass1()).historyTransfer(acc);
  }
}

Und die Suite mit den erwarteten Parametern:

<suite name="Suite">
  <test name="My Test" >
    <classes>
        <class name="com.SimpleTest">
            <methods>
              <include name="step1">
              <parameter name="acc" value="11111"></parameter>
            </methods>
            <methods>
              <include name="step2">
              <parameter name="senderAcc" value="11111"></parameter>
              <parameter name="beneficiaryAcc" value="22222"></parameter>
              <parameter name="amount" value="100"></parameter>
            </methods>
            <methods>
              <include name="step3">
              <parameter name="acc" value="22222"></parameter>
            </methods>
        </class>
    </classes>
  </test>
</suite>

(Haftungsausschluss: Ich habe das XML nicht mit dem dtd verglichen, könnte falsch sein, aber Sie haben die Idee)

Die Benennung oder die Art und Weise, wie Fixtures erstellt werden, hängt von Ihren eigenen Konventionen ab.

1 vbn Dec 16 2020 at 15:36

Sie können die Priorität oder Abhängigkeit von einer anderen Methode mithilfe der hier beschriebenen Anmerkungen festlegen:

https://testng.org/doc/documentation-main.html#annotations

Suchen Sie nach @ Test.priority oder @ Test.dependsOnMethods

Auf diese Weise können Sie die Tests nacheinander seriell ausführen.

1 user7294900 Dec 22 2020 at 16:22

Ich weiß nicht, warum Sie gleiche Testklasse in getrennten Tests ausgeführt werden müssen, aber als Testbeginn kann es all relevanten Kontext laden , die vielleicht Zeit in Anspruch nehmen und vielleicht nach Testende kann es muß einige Ressourcen schließen, kann sowohl Zeit in Anspruch nehmen / paar Sekunden

Sie können ausführlich verwenden , um weitere Details zur Ursache der Verzögerung zu verwenden (und weitere Protokolle hinzuzufügen, um das Timing anzuzeigen).

<suite name="Suite" verbose="10">

Die Ausführlichkeitsstufe ist 0 bis 10, wobei 10 am detailliertesten ist. Sobald Sie 10 festgelegt haben, sehen Sie, dass die Konsolenausgabe Informationen zu Tests, Methoden und Listenern usw. enthält.

Um den Prozess zu beschleunigen, können Sie auch die parallele Funktion von TestNG verwenden

Mit dem Attribut threadPoolSize können Sie angeben, wie viele Threads für diese Ausführung zugewiesen werden sollen.