Ustaw czas opóźnienia dla każdego <test> w TestNG

Dec 14 2020

Po pierwsze jako informacja : umieszczam każdą @Testw innej klasie (więc oczywiście każda klasa ma tylko 1 @Testadnotację).

Właściwie moim celem jest ponowne uruchomienie tej samej klasy z innym parametrem, ale najpierw chcę uruchomić inną klasę.

Próbowałem znaleźć wiele odniesień, których TestNG nie pozwala na powtórzenie klasy lub @Testadnotacji metody w jednym <test>. Rozważam invocationCountfunkcję, o której myślę invocationCount, ale nie mogę osiągnąć celu, invocationCountponieważ ta funkcja powtarza @Testw tym samym czasie, a następnie mogę uruchomić inną @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()));
    }
}

Wyobrażam sobie, że działam jak poniżej:

<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>

Ale powyższa konfiguracja nie przebiegła zgodnie z planem, ponieważ druga SimpleTest1nie została wykonana.

Potem próbowałem uruchomić to osobno, <test>jak buczenie i sukces, ale mam do czynienia z nowym problemem dotyczącym czasu opóźnienia <test>.

Uruchom wiele <test>szeregowo (nie równolegle) w następujący sposób:

<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>

Zależność TestNG Maven:

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

Pewnie:

<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 (wersja: 2018-09 (4.9.0))

System operacyjny: macOS Mojave (wersja 10.14.6)

Wyjście :

[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
===============================================

Ale po zakończeniu pierwszego <test>, następuje opóźnienie około 10 sekund przed następnymi <test>uruchomieniami, a także następnym testem.

Uwaga : myślałem, że to problem z IDE (używam Eclipse), ale tak nie było. Próbowałem uruchomić go na 2 sposoby, za pośrednictwem IDE i wiersza poleceń, i dałem ten sam wynik w przypadku problemu z opóźnieniem.

Za pomocą wiersza poleceń za pomocą tego polecenia:

mvn clean test -Dsurefire.suiteXmlFiles=testng.xml

Czy jest jakaś konfiguracja zmniejszająca powyższy czas opóźnienia?

Odpowiedzi

2 juherr Dec 23 2020 at 19:36

Po pierwsze, pakiet nie jest planem testów (przy okazji może być dobrym żądaniem funkcji), ale tylko sposobem na wybór testów. Oznacza to, że nie możesz zdefiniować zależności między testami. Dlatego posiadanie tej samej klasy testowej nie działa (powinno zawieść lub utworzyć różne instancje).

Jak rozumiem Twoje potrzeby, najlepszym sposobem jest oddzielenie własnej logiki i jej integracji z frameworkiem testowym:

  1. zaprojektuj klasy pomocników / urządzeń, jak chcesz:

_

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. zdefiniować klasy do integracji z frameworkiem testowym

_

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);
  }
}

I pakiet o oczekiwanych parametrach:

<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>

(zastrzeżenie: nie sprawdziłem XML w porównaniu z dtd, może się mylić, ale masz pomysł)

Nazewnictwo lub sposób tworzenia urządzeń zależy od własnych konwencji.

1 vbn Dec 16 2020 at 15:36

Możesz ustawić priorytet lub zależność od innej metody za pomocą adnotacji, jak opisano tutaj:

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

sprawdź @ Test.priority lub @ Test.dependsOnMethods

W ten sposób będziesz mógł uruchamiać testy jeden po drugim seryjnie.

1 user7294900 Dec 22 2020 at 16:22

Nie wiem, dlaczego musisz uruchomić tę samą klasę testową w oddzielnych testach, ale podczas uruchamiania testu może załadować cały odpowiedni kontekst, co może zająć trochę czasu, a może po zakończeniu testu może być konieczne zamknięcie niektórych zasobów, oba mogą zająć trochę czasu / niewiele sekundy

Możesz użyć opcji szczegółowej, aby podać więcej szczegółów na temat przyczyny opóźnienia (i dodać więcej dzienników, aby wyświetlić czas)

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

Poziom szczegółowości wynosi od 0 do 10, gdzie 10 jest najbardziej szczegółowym. Gdy ustawisz ją na 10, zobaczysz, że dane wyjściowe konsoli będą zawierały informacje dotyczące testów, metod, detektorów itp.

Aby przyspieszyć proces, możesz również użyć funkcji równoległej TestNG

Atrybut threadPoolSize umożliwia określenie, ile wątków ma być przydzielonych do tego wykonania.