Pertama sebagai info: Saya menempatkan setiap @Test di kelas yang berbeda (jadi tentu saja setiap kelas hanya memiliki 1 anotasi @Test).

Sebenarnya tujuan saya ingin menjalankan kembali class yang sama dengan parameter yang berbeda, namun saya ingin menjalankan class lain terlebih dahulu.

Saya telah mencoba menemukan banyak referensi bahwa TestNG tidak mengizinkan pengulangan kelas atau anotasi metode @Test dalam satu <test>. Pengulangan yang disediakan adalah fungsi invocationCount, saya mengerti tentang invocationCount, tetapi saya tidak dapat mencapai tujuan saya dengan invocationCount karena fungsi ini mengulangi @Test pada waktu yang sama dan maka saya dapat menjalankan @Test lain.

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

Saya membayangkan menjalankan seperti konfigurasi di bawah ini:

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

Namun konfigurasi di atas tidak berjalan sesuai rencana karena SimpleTest1 kedua tidak dieksekusi.

Kemudian saya mencoba menjalankannya di <test> terpisah seperti di bawah dan berhasil, tetapi saya menghadapi masalah baru tentang waktu tunda setiap <test>.

Jalankan beberapa <test> secara serial (tidak paralel) sebagai berikut:

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

Ketergantungan TestNG Maven:

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

Pasti:

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

OS : macOS Mojave (Versi 10.14.6)

Keluaran:

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

Tetapi setelah <test> pertama selesai, ada penundaan sekitar 10 detik sebelum <test> berikutnya berjalan, serta pengujian berikutnya.

Catatan: Saya pikir ini adalah masalah dengan IDE (saya menggunakan Eclipse), tetapi ternyata tidak. Saya sudah mencoba menjalankannya dengan 2 cara, melalui IDE dan baris perintah, dan memberi saya hasil yang sama tentang masalah penundaan ini.

Melalui baris perintah menggunakan perintah ini:

mvn clean test -Dsurefire.suiteXmlFiles=testng.xml

Apakah ada konfigurasi untuk mengurangi waktu tunda di atas?

2
frianH 14 Desember 2020, 10:18

3 jawaban

Jawaban Terbaik

Pertama, suite bukanlah rencana pengujian (bisa berupa permintaan fitur yang bagus) tetapi hanya cara untuk memilih pengujian. Ini berarti Anda tidak dapat menentukan ketergantungan antar tes. Itu sebabnya memiliki kelas pengujian yang sama tidak berfungsi (seharusnya gagal atau membuat instance yang berbeda).

Seperti yang saya pahami kebutuhan Anda, cara terbaik adalah memisahkan logika Anda sendiri dan integrasinya dengan kerangka pengujian:

  1. rancang kelas pembantu/perlengkapan Anda seperti yang Anda inginkan:

_

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. tentukan kelas untuk integrasi dengan kerangka pengujian

_

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

Dan suite dengan parameter yang diharapkan:

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

(penafian: Saya tidak memeriksa XML terhadap dtd, bisa jadi salah tetapi Anda punya ide)

Penamaan atau cara membuat perlengkapan tergantung pada konvensi Anda sendiri.

2
juherr 23 Desember 2020, 12:36

Anda dapat mengatur prioritas atau ketergantungan pada metode lain menggunakan anotasi seperti yang dijelaskan di sini:

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

Periksa @Test.priority atau @Test.dependsOnMethods

Melakukan ini, akan memungkinkan Anda menjalankan tes satu demi satu secara serial.

1
vbn 16 Desember 2020, 08:43

Saya tidak tahu mengapa Anda perlu menjalankan kelas pengujian yang sama dalam pengujian terpisah, tetapi ketika memulai pengujian, ia dapat memuat semua konteks yang relevan yang mungkin membutuhkan waktu dan mungkin setelah pengujian berakhir, mungkin perlu menutup beberapa sumber daya, keduanya mungkin memerlukan waktu/< a href="https://stackoverflow.com/questions/44266905/how-to-speed-up-the-starting-time-of-testng-tests-in-Eclipse">beberapa detik

Anda dapat menggunakan verbose untuk menggunakan lebih banyak detail penyebab penundaan (dan tambahkan lebih banyak log untuk melihat waktu)

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

Tingkat verbositas adalah 0 hingga 10, di mana 10 adalah yang paling detail. Setelah Anda menyetelnya ke 10, Anda akan melihat bahwa keluaran konsol akan berisi informasi mengenai pengujian, metode, dan pendengar, dll.

Untuk mempercepat proses, Anda juga dapat menggunakan fitur parallel TestNG

Atribut threadPoolSize memungkinkan Anda untuk menentukan berapa banyak utas yang harus dialokasikan untuk eksekusi ini.

1
user7294900 22 Desember 2020, 09:22