@Tokopedia vs @tokopedia

1. Perkenalan

Dalam tutorial singkat ini, kami akan menjelaskan perbedaan antara anotasi @Before , @BeforeClass , @BeforeEach dan @BeforeAll di JUnit 4 dan 5 - dengan contoh praktis bagaimana menggunakannya.

Kami juga akan membahas secara singkat penjelasan pelengkap @After mereka .

Mari kita mulai dengan JUnit 4.

2. @Sebelumnya

Metode yang dianotasi dengan anotasi @Before dijalankan sebelum setiap pengujian. Ini berguna ketika kita ingin menjalankan beberapa kode umum sebelum menjalankan tes.

Mari kita lihat contoh di mana kita menginisialisasi daftar dan menambahkan beberapa nilai:

@RunWith(JUnit4.class) public class BeforeAndAfterAnnotationsUnitTest { // ... private List list; @Before public void init() { LOG.info("startup"); list = new ArrayList(Arrays.asList("test1", "test2")); } @After public void teardown() { LOG.info("teardown"); list.clear(); } }

Perhatikan bahwa kami juga menambahkan metode lain yang dianotasi dengan @After untuk menghapus daftar setelah eksekusi setiap pengujian.

Setelah itu, mari tambahkan beberapa tes untuk memeriksa ukuran daftar kita:

@Test public void whenCheckingListSize_thenSizeEqualsToInit() { LOG.info("executing test"); assertEquals(2, list.size()); list.add("another test"); } @Test public void whenCheckingListSizeAgain_thenSizeEqualsToInit() { LOG.info("executing another test"); assertEquals(2, list.size()); list.add("yet another test"); }

Dalam kasus ini, penting untuk memastikan bahwa lingkungan pengujian disiapkan dengan benar sebelum menjalankan setiap pengujian karena daftar diubah selama setiap eksekusi pengujian.

Jika kita melihat keluaran log, kita dapat memeriksa bahwa metode init dan pembongkaran dijalankan satu kali per pengujian:

... startup ... executing another test ... teardown ... startup ... executing test ... teardown

3. @BeforeClass

Saat kita ingin menjalankan operasi umum yang mahal sebelum setiap pengujian, sebaiknya jalankan hanya sekali sebelum menjalankan semua pengujian menggunakan @BeforeClass . Beberapa contoh operasi mahal yang umum adalah pembuatan koneksi database atau startup server.

Mari buat kelas pengujian sederhana yang mensimulasikan pembuatan koneksi database:

@RunWith(JUnit4.class) public class BeforeClassAndAfterClassAnnotationsUnitTest { // ... @BeforeClass public static void setup() { LOG.info("startup - creating DB connection"); } @AfterClass public static void tearDown() { LOG.info("closing DB connection"); } }

Perhatikan bahwa metode ini harus statis , sehingga akan dijalankan sebelum menjalankan pengujian kelas.

Seperti yang kita lakukan sebelumnya, mari tambahkan juga beberapa tes sederhana:

@Test public void simpleTest() { LOG.info("simple test"); } @Test public void anotherSimpleTest() { LOG.info("another simple test"); }

Kali ini, jika kita melihat output log, kita dapat memeriksa apakah metode setup dan tearDown dijalankan hanya sekali:

... startup - creating DB connection ... simple test ... another simple test ... closing DB connection

4. @BeforeEach dan @BeforeAll

@BeforeEac h dan @BeforeAll adalah setara JUnit 5 dari @Before dan @BeforeClass . Anotasi ini diganti namanya dengan nama yang lebih jelas untuk menghindari kebingungan.

Mari kita menduplikasi kelas sebelumnya kami menggunakan ini penjelasan baru, dimulai dengan @BeforeEach dan @AfterEach penjelasan:

@RunWith(JUnitPlatform.class) class BeforeEachAndAfterEachAnnotationsUnitTest { // ... private List list; @BeforeEach void init() { LOG.info("startup"); list = new ArrayList(Arrays.asList("test1", "test2")); } @AfterEach void teardown() { LOG.info("teardown"); list.clear(); } // ... }

Jika kita memeriksa log, kita bisa memastikan bahwa ia bekerja dengan cara yang sama seperti dengan @Before dan @After penjelasan:

... startup ... executing another test ... teardown ... startup ... executing test ... teardown

Akhirnya, mari kita melakukan hal yang sama dengan kelas tes lain untuk melihat @BeforeAll dan @AfterAll penjelasan dalam tindakan:

@RunWith(JUnitPlatform.class) public class BeforeAllAndAfterAllAnnotationsUnitTest { // ... @BeforeAll public static void setup() { LOG.info("startup - creating DB connection"); } @AfterAll public static void tearDown() { LOG.info("closing DB connection"); } // ... }

Dan hasilnya sama dengan anotasi lama:

... startup - creating DB connection ... simple test ... another simple test ... closing DB connection

5. Kesimpulan

Dalam artikel ini, kami menunjukkan perbedaan antara anotasi @Before , @BeforeClass , @BeforeEach dan @BeforeAll di JUnit dan kapan masing-masing harus digunakan.

Seperti biasa, kode sumber lengkap dari contoh tersedia di GitHub.