Bagaimana cara kerja Junit @Rule?

195

Saya ingin menulis kasus pengujian untuk sebagian besar kode, saya ingin mengetahui detail @Rulefitur penjelasan JUnit , sehingga saya dapat menggunakannya untuk menulis kasus pengujian. Harap berikan beberapa jawaban atau tautan yang bagus, yang memberikan deskripsi terperinci tentang fungsinya melalui contoh sederhana.

Dipak
sumber
Saya menemukan artikel ini menjelaskan @Ruledengan cukup baik, terutama memeriksa bagian terakhir "Urutan Acara Secara Terinci"
Peter Perháč
Saya pikir ini mirip dengan konsep injeksi, benarkan?
Chao
Terima kasih telah berbagi tautan itu. Satu hal yang tidak jelas. Kapan DEFAULT Statement.evaluate () dipanggil? Apakah ini dipanggil sebelum evaluasi () dari semua aturan atau setelah semuanya? Aku menebak semuanya.
MasterJoe2
@ testerjoe2 Anda dapat memilih untuk mengabaikan Pernyataan default sepenuhnya. Anda dapat memilih untuk mendelegasikannya atau Anda dapat langsung menggantinya dengan Pernyataan Anda sendiri. Itu tidak dipanggil , Anda bisa menyebutnya atau tidak. Itu di poin 10: "Metode evaluasi () pernyataan tangkapan layar memanggil metode evaluasi () pernyataan standar."
Peter Perháč

Jawaban:

155

Aturan digunakan untuk menambahkan fungsionalitas tambahan yang berlaku untuk semua tes dalam kelas tes, tetapi dengan cara yang lebih umum.

Sebagai contoh, ExternalResource mengeksekusi kode sebelum dan sesudah suatu metode pengujian, tanpa harus menggunakan @Beforedan @After. Menggunakan ExternalResourcedaripada @Beforedan @Aftermemberi peluang untuk menggunakan kembali kode yang lebih baik; aturan yang sama dapat digunakan dari dua kelas tes yang berbeda.

Desainnya didasarkan pada: Interceptors in JUnit

Untuk informasi lebih lanjut lihat JUnit wiki: Rules .

Matthew Farwell
sumber
1
Koreksi: "Misalnya, ExternalResource mengeksekusi kode sebelum dan sesudah kelas uji ." Ada sesuatu tentang menggunakan apply () untuk menjalankan ExternalResource di antara pengujian.
derekm
62

Aturan Junit bekerja berdasarkan prinsip AOP (pemrograman berorientasi aspek). Ini memotong metode pengujian sehingga memberikan kesempatan untuk melakukan beberapa hal sebelum atau setelah pelaksanaan metode pengujian tertentu.

Ambil contoh kode di bawah ini:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

Setiap kali metode pengujian di atas dijalankan, folder sementara dibuat dan terhapus setelah eksekusi metode. Ini adalah contoh aturan out-of-box yang disediakan oleh Junit.

Perilaku serupa juga dapat dicapai dengan membuat aturan kita sendiri. Junit menyediakan antarmuka TestRule, yang dapat diimplementasikan untuk membuat Aturan Junit kita sendiri.

Berikut ini tautan yang bermanfaat untuk referensi:

Abhishek Mohanty
sumber
4
sehingga terhapus tanpa menulis kode apa pun untuk menghapus / menghapus objek?
Dror
lihat sumber github.com/junit-team/junit4/blob/master/src/main/java/org/… , folder tersebut dibuat dengan metode panggilan balik before () dan dihapus dengan metode panggilan balik after (). ..
Pierluigi Vernetto
1
Bagi orang-orang yang mungkin belum mengerti mengapa TemporaryFolder dihapus, itu karena TemporaryFolder yang disediakan oleh Junit untuk berfungsi sebagai folder temp yang secara otomatis dihapus - yaitu langkah teardown adalah bagian dari kelas TemporaryFolder itu sendiri.
Mindaugas Bernatavičius
17

tl; dr untuk cara kerjanya: JUnit membungkus metode pengujian Anda dalam objek Statement jadi statement.Execute () menjalankan pengujian Anda. Kemudian alih-alih memanggil statement.Execute () langsung untuk menjalankan tes Anda, JUnit meneruskan Pernyataan ke TestRule dengan penjelasan @Rule. Fungsi "terapkan" TestRule mengembalikan Pernyataan baru yang diberikan Pernyataan bersama pengujian Anda. Metode Execute () Pernyataan baru dapat memanggil metode pelaksanaan Pernyataan pernyataan (atau tidak, atau menyebutnya beberapa kali), dan melakukan apa pun yang diinginkan sebelum dan sesudahnya. Sekarang JUnit memiliki Pernyataan baru yang melakukan lebih dari sekedar menjalankan tes, dan itu dapat kembali meneruskannya ke aturan lain sebelum akhirnya memanggil Execute.

Alexander Taylor
sumber
2
Pernyataan memiliki metode evaluasi yang tidak dijalankan.
Hemanth
0

Aturan digunakan untuk meningkatkan perilaku masing-masing metode pengujian dengan cara yang umum. Aturan Junit mencegat metode pengujian dan memungkinkan kami untuk melakukan sesuatu sebelum metode pengujian mulai dieksekusi dan setelah metode pengujian dijalankan.

Misalnya, dengan menggunakan aturan @Timeout, kita dapat mengatur batas waktu untuk semua tes.

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

Aturan @T temporaryFolder digunakan untuk membuat folder sementara, file. Setiap kali metode pengujian dieksekusi, folder sementara dibuat dan terhapus setelah eksekusi metode.

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

Anda dapat melihat contoh beberapa aturan bawaan yang disediakan oleh junit di tautan ini .

Hari Krishna
sumber