Atur waktu tunda untuk setiap <test> di TestNG
Pertama sebagai info : Saya taruh masing-masing @Test
di kelas yang berbeda (jadi tentunya tiap kelas hanya punya 1 @Test
anotasi).
Sebenarnya tujuan saya adalah ingin menjalankan kembali kelas yang sama dengan parameter yang berbeda, tetapi saya ingin menjalankan kelas lain terlebih dahulu.
Saya telah mencoba menemukan banyak referensi yang TestNG tidak mengizinkan pengulangan kelas atau @Test
anotasi metode dalam satu kelas <test>
. Pengulangan yang diberikan adalah sebuah invocationCount
fungsi, saya mengerti invocationCount
, tetapi saya tidak dapat mencapai tujuan saya dengan invocationCount
karena fungsi ini berulang @Test
pada saat yang sama dan kemudian saya dapat menjalankan yang lain @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()));
}
}
Saya membayangkan untuk 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>
Tetapi konfigurasi di atas tidak berjalan sesuai rencana karena konfigurasi kedua SimpleTest1
tidak dijalankan.
Kemudian saya mencoba menjalankannya secara terpisah <test>
seperti di bawah dan sukses, tetapi saya menghadapi masalah baru tentang waktu tunda masing-masing <test>
.
Jalankan beberapa <test>
secara serial (bukan 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
===============================================
Namun setelah tes pertama <test>
selesai, terjadi penundaan sekitar 10 detik sebelum <test>
tes berjalan berikutnya , begitu juga dengan tes 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?
Jawaban
Pertama, suite bukanlah rencana pengujian (bisa menjadi permintaan fitur yang bagus btw) tetapi hanya cara untuk memilih pengujian. Ini berarti Anda tidak dapat menentukan ketergantungan antar pengujian. Itulah mengapa memiliki kelas pengujian yang sama tidak berfungsi (seharusnya gagal atau membuat instance yang berbeda).
Saat saya memahami kebutuhan Anda, cara terbaik adalah dengan memisahkan logika Anda sendiri dan integrasinya dengan kerangka pengujian:
- rancang kelas helper / fixture 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()));
}
}
- 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.
Anda dapat menyetel 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.
Saya tidak tahu mengapa Anda perlu menjalankan kelas pengujian yang sama dalam pengujian terpisah, tetapi saat memulai pengujian, mungkin memuat semua konteks yang relevan yang mungkin memerlukan waktu dan mungkin setelah pengujian berakhir, mungkin perlu menutup beberapa sumber daya, keduanya mungkin memerlukan waktu / sedikit detik
Anda dapat menggunakan verbose untuk menggunakan lebih banyak detail tentang penyebab penundaan (dan menambahkan 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 mengaturnya ke 10, Anda akan melihat bahwa output konsol akan berisi informasi mengenai tes, metode, dan pendengar, dll.
Untuk mempercepat proses, Anda juga dapat menggunakan fitur paralel TestNG
Atribut threadPoolSize memungkinkan Anda menentukan berapa banyak utas yang harus dialokasikan untuk eksekusi ini.