Seperti judulnya, saya mencari cara sederhana untuk menjalankan pengujian JUnit 4.x beberapa kali berturut-turut secara otomatis menggunakan Eclipse.
Contoh akan menjalankan pengujian yang sama 10 kali berturut-turut dan melaporkan kembali hasilnya.
Kami sudah memiliki cara yang rumit untuk melakukan ini, tetapi saya sedang mencari cara sederhana untuk melakukannya sehingga saya dapat yakin bahwa tes tak stabil yang saya coba perbaiki tetap diperbaiki.
Solusi ideal adalah plugin / pengaturan / fitur Eclipse yang tidak saya sadari.
Jawaban:
Cara termudah (dengan jumlah paling sedikit kode baru yang diperlukan) untuk melakukan ini adalah dengan menjalankan pengujian sebagai pengujian parametrized (beri anotasi dengan
@RunWith(Parameterized.class)
dan tambahkan metode untuk menyediakan 10 parameter kosong). Dengan begitu framework akan menjalankan pengujian 10 kali.Pengujian ini harus menjadi satu-satunya pengujian di kelas, atau lebih baik letakkan semua metode pengujian yang harus dijalankan 10 kali di kelas.
Berikut ini contohnya:
Dengan hal di atas, bahkan mungkin untuk melakukannya dengan konstruktor tanpa parameter, tetapi saya tidak yakin apakah penulis kerangka bermaksud itu, atau apakah itu akan rusak di masa mendatang.
Jika Anda menerapkan pelari Anda sendiri, Anda dapat meminta pelari menjalankan pengujian 10 kali. Jika Anda menggunakan runner pihak ketiga, maka dengan 4.7, Anda dapat menggunakan
@Rule
anotasi baru dan mengimplementasikanMethodRule
antarmukanya sehingga ia mengambil pernyataan dan mengeksekusinya 10 kali dalam perulangan for. Kerugian saat ini dari pendekatan ini adalah@Before
dan@After
dijalankan hanya sekali. Ini kemungkinan akan berubah di versi JUnit berikutnya (yang@Before
akan berjalan setelah@Rule
), tetapi terlepas dari apa pun Anda akan bertindak pada contoh objek yang sama (sesuatu yang tidak benar dariParameterized
pelari). Ini mengasumsikan bahwa pelari apa pun yang Anda jalankan dengan kelas mengenali@Rule
anotasi dengan benar . Itu hanya kasus jika itu mendelegasikan ke pelari JUnit.Jika Anda menjalankan dengan runner kustom yang tidak mengenali
@Rule
anotasi, Anda benar-benar harus menulis runner Anda sendiri yang mendelegasikan secara tepat ke Runner tersebut dan menjalankannya 10 kali.Perhatikan bahwa ada cara lain untuk menyelesaikan masalah ini (seperti pelari Teori) tetapi semuanya membutuhkan pelari. Sayangnya JUnit saat ini tidak mendukung lapisan pelari. Itu adalah pelari yang mengikat pelari lainnya.
sumber
Dengan IntelliJ, Anda dapat melakukan ini dari konfigurasi pengujian. Setelah Anda membuka jendela ini, Anda dapat memilih untuk menjalankan pengujian beberapa kali.
ketika Anda menjalankan pengujian, intellij akan menjalankan semua pengujian yang telah Anda pilih untuk berapa kali Anda tentukan.
Contoh menjalankan 624 pengujian 10 kali:
sumber
Saya telah menemukan bahwa anotasi berulang Spring berguna untuk hal semacam itu:
Dokumen terbaru (Spring Framework 4.3.11.RELEASE API):
sumber
Terinspirasi oleh sumber daya berikut:
Contoh
Buat dan gunakan
@Repeat
anotasi sebagai berikut:Repeat.java
RepeatRule.java
PowerMock
Menggunakan solusi ini dengan
@RunWith(PowerMockRunner.class)
, memerlukan pembaruan ke Powermock 1.6.5 (yang menyertakan tambalan ).sumber
Dengan JUnit 5 saya dapat menyelesaikan ini menggunakan anotasi @RepruptedTest :
Perhatikan bahwa
@Test
anotasi tidak boleh digunakan bersama@RepeatedTest
.sumber
Ada yang salah dengan:
Tidak seperti kasus saat Anda menguji setiap larik nilai, Anda tidak terlalu peduli menjalankan mana yang gagal.
Tidak perlu melakukan konfigurasi atau penjelasan apa yang dapat Anda lakukan dalam kode.
sumber
@Before
metode beranotasi secara manual sebelumitWorks()
memecahkan masalah saya.Ini bekerja lebih mudah bagi saya.
sumber
public class RepeatRunner extends BlockJUnit4ClassRunner { public RepeatRunner(Class klass) throws InitializationError { super(klass); } @Override public void run(final RunNotifier notifier) { for (int i = 0; i < 10; i++) { super.run(notifier); } } }
Meskipun setidaknya di plugin Eclipse JUnit Anda mendapatkan hasil seperti: "10/1 tes lulus"Ada anotasi Intermiten di perpustakaan tempus-fugit yang bekerja dengan JUnit 4.7
@Rule
untuk mengulangi pengujian beberapa kali atau bersama@RunWith
.Sebagai contoh,
Setelah pengujian dijalankan (dengan IntermittentTestRunner di
@RunWith
),testCounter
akan sama dengan 99.sumber
Saya membangun modul yang memungkinkan melakukan tes semacam ini. Tapi itu difokuskan tidak hanya pada pengulangan. Tetapi untuk menjamin bahwa beberapa bagian kode aman untuk Thread.
https://github.com/anderson-marques/concurrent-testing
Ketergantungan Maven:
Contoh penggunaan:
Ini adalah proyek open source. Silakan perbaiki.
sumber
Anda dapat menjalankan pengujian JUnit dari metode utama dan mengulanginya berkali-kali yang Anda butuhkan:
sumber
Ini pada dasarnya adalah jawaban yang diberikan Yishai di atas, ditulis ulang di Kotlin:
sumber