@Bebulan vs @BeforeClass vs @BeforeEach vs @BeforeAll

1. Pengenalan

Dalam tutorial ringkas ini, kita akan menerangkan perbezaan antara @Before , @BeforeClass , @BeforeEach dan @BeforeAll anotasi di JUnit 4 dan 5 - dengan contoh praktikal bagaimana menggunakannya.

Kami juga akan merangkumi sebentar anotasi @Selepas itu .

Mari mulakan dengan JUnit 4.

2. @ Sebelum

Kaedah yang diberi penjelasan dengan penjelasan @Sebelum dilaksanakan sebelum setiap ujian. Ini berguna apabila kita ingin melaksanakan beberapa kod biasa sebelum menjalankan ujian.

Mari kita lihat contoh di mana kita memulakan senarai dan menambah 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 bahawa kami juga menambahkan kaedah lain yang diberi penjelasan dengan @After untuk membersihkan senarai setelah pelaksanaan setiap ujian.

Selepas itu, mari tambahkan beberapa ujian untuk memeriksa ukuran senarai kami:

@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 kes ini, sangat penting untuk memastikan bahawa persekitaran ujian disiapkan dengan betul sebelum menjalankan setiap ujian kerana senarai diubah semasa setiap ujian dijalankan.

Sekiranya kita melihat output log, kita dapat memeriksa bahawa kaedah init dan teardown dilaksanakan sekali setiap ujian:

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

3. @BeforeClass

Apabila kita ingin menjalankan operasi biasa yang mahal sebelum setiap ujian, lebih baik melaksanakannya hanya sekali sebelum menjalankan semua ujian menggunakan @BeforeClass . Beberapa contoh operasi mahal yang biasa dilakukan ialah membuat sambungan pangkalan data atau permulaan pelayan.

Mari buat kelas ujian mudah yang mensimulasikan pembuatan sambungan pangkalan data:

@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 bahawa kaedah ini harus statik , jadi mereka akan dijalankan sebelum menjalankan ujian kelas.

Seperti yang kita lakukan sebelumnya, mari kita tambahkan beberapa ujian mudah:

@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 bahawa kaedah penyediaan dan tearDown dilaksanakan hanya sekali:

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

4. @BeforeEach dan @BeforeAll

@BeforeEac h dan @BeforeAll adalah JUnit 5 yang setara dengan @Before dan @BeforeClass . Anotasi ini dinamakan semula dengan nama yang lebih jelas untuk mengelakkan kekeliruan.

Mari gandakan kelas sebelumnya dengan menggunakan anotasi baru ini, bermula dengan anotasi @BeforeEach dan @AfterEach :

@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 menyemak balak, kami boleh mengesahkan bahawa ia berfungsi dengan cara yang sama seperti dengan @Before dan @After anotasi:

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

Akhir sekali, mari kita melakukan perkara yang sama dengan kelas ujian 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 outputnya sama seperti dengan anotasi lama:

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

5. Kesimpulan

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

Seperti biasa, kod sumber penuh contoh terdapat di GitHub.