Saya telah menjelajahi stackoverflow selama beberapa hari, mencoba menemukan cara menjalankan kembali seluruh kelas tes, dan bukan hanya @Test
langkah. Banyak yang mengatakan bahwa ini tidak didukung oleh TestNG dan IRetryAnalyzer
, sementara beberapa telah memposting solusi, itu tidak benar-benar berfungsi. Adakah yang bisa melakukannya? Dan hanya untuk memperjelas alasan untuk ini, untuk menghindari jawaban yang mengatakan bahwa tidak didukung dalam tujuan: TestNG adalah alat yang tidak hanya untuk pengembang. Arti yang juga digunakan dari penguji sw untuk pengujian e2e. Tes E2e dapat memiliki langkah-langkah yang bergantung pada masing-masing dari yang sebelumnya. Jadi ya itu sah untuk menjalankan kembali seluruh kelas tes, daripada sederhana @Test
, yang mudah dapat dilakukan melalui IRetryAnalyzer
.
Contoh dari apa yang ingin saya capai adalah:
public class DemoTest extends TestBase {
@Test(alwaysRun = true, description = "Do this")
public void testStep_1() {
driver.navigate().to("http://www.stackoverflow.com");
Assert.assertEquals(driver.getCurrentUrl().contains("stackoverflow)"));
}
@Test(alwaysRun = true, dependsOnMethods = "testStep_1", description = "Do that")
public void testStep_2() {
driver.press("button");
Assert.assertEquals(true, driver.elementIsVisible("button"));
}
@Test(alwaysRun = true, dependsOnMethods = "testStep_2", description = "Do something else")
public void testStep_3() {
driver.press("button2");
Assert.assertEquals(true, driver.elementIsVisible("button"));
}
}
Katakanlah itu testStep_2
gagal, saya ingin menjalankan kembali class DemoTest
dan bukan hanyatestStep_2
sumber
Jawaban:
Oke, saya tahu Anda mungkin menginginkan beberapa properti mudah yang dapat Anda tentukan di @BeforeClass Anda atau sesuatu seperti itu, tetapi kami mungkin harus menunggu untuk diimplementasikan. Setidaknya aku juga tidak bisa menemukannya.
Berikut ini adalah jelek sekali tetapi saya pikir itu melakukan pekerjaan, setidaknya dalam skala kecil, dibiarkan untuk melihat bagaimana berperilaku dalam skenario yang lebih kompleks. Mungkin dengan lebih banyak waktu, ini bisa diperbaiki menjadi sesuatu yang lebih baik.
Oke, jadi saya membuat Kelas Tes yang serupa dengan Anda:
Saya memiliki
Listener
kelas super hanya dalam kasus saya ingin memperluas ini ke kelas lain, tetapi Anda juga dapat mengatur pendengar di kelas tes Anda.Tiga dari 4 metode di atas memiliki a
RetryAnalyzer
. Saya meninggalkantestStep_4
tanpa itu untuk memastikan bahwa apa yang saya lakukan selanjutnya tidak mengacaukan sisa eksekusi. SaidRetryAnalyzer
tidak akan benar-benar mencoba lagi (perhatikan bahwa metode kembalifalse
), tetapi akan melakukan hal berikut:Ini akan membuat eksekusi di dalam eksekusi Anda. Itu tidak akan mengacaukan laporan, dan segera setelah selesai, itu akan melanjutkan dengan eksekusi utama Anda. Tetapi itu akan "mencoba kembali" metode dalam grup itu.
Ya saya tahu, saya tahu. Ini berarti bahwa Anda akan menjalankan suite pengujian Anda selamanya dalam lingkaran yang abadi. Itu sebabnya
RetryAnnotationTransformer
. Di dalamnya, kami akan menghapus RetryAnalyzer dari eksekusi kedua tes tersebut:Sekarang kita memiliki yang terakhir dari masalah kita. Rangkaian uji asli kami tidak tahu tentang eksekusi "coba lagi" di sana. Di sinilah ia menjadi sangat jelek. Kita perlu memberi tahu Reporter kita apa yang baru saja terjadi. Dan ini adalah bagian yang saya anjurkan agar Anda tingkatkan. Saya kekurangan waktu untuk melakukan sesuatu yang lebih baik, tetapi jika saya bisa, saya akan mengeditnya di beberapa titik.
Pertama, kita perlu tahu apakah eksekusi retryTestNG berhasil. Mungkin ada sejuta cara untuk melakukan ini dengan lebih baik, tetapi untuk sekarang ini berfungsi. Saya mengatur pendengar hanya untuk eksekusi ulang. Anda dapat melihatnya di
TestRetry
atas, dan terdiri dari yang berikut ini:Sekarang Pendengar dari suite utama, yang Anda lihat di atas di kelas super
TestConfig
akan melihat apakah itu terjadi dan jika berjalan dengan baik dan akan memperbarui laporan:Laporan tersebut harus menunjukkan sekarang 3 tes lulus (karena mereka coba lagi) dan satu gagal karena itu bukan bagian dari 3 tes lainnya:
Saya tahu itu bukan apa yang Anda cari, tetapi saya membantu ini melayani Anda sampai mereka menambahkan fungsionalitas ke TestNG.
sumber