Pengantar TestNG

1. Ikhtisar

Pada artikel ini, kami akan memperkenalkan kerangka pengujian TestNG.

Kami akan fokus pada: penyiapan framework, penulisan kasus pengujian dan konfigurasi sederhana, eksekusi pengujian, pembuatan laporan pengujian, dan eksekusi pengujian secara bersamaan.

2. Penyiapan

Mari kita mulai dengan menambahkan ketergantungan Maven di file pom.xml kita :

 org.testng testng 7.1.0 test 

Versi terbaru dapat ditemukan di repositori Maven.

Saat menggunakan Eclipse, plugin TestNG dapat diunduh dan diinstal dari Eclipse Marketplace.

3. Menulis Test Case

Untuk menulis pengujian menggunakan TestNG, kita hanya perlu memberi anotasi pada metode pengujian dengan org.testng.annotations. Anotasi pengujian :

@Test public void givenNumber_whenEven_thenTrue() { assertTrue(number % 2 == 0); }

4. Konfigurasi Uji

Saat menulis kasus pengujian, sering kali kita perlu menjalankan beberapa konfigurasi atau instruksi inisialisasi sebelum eksekusi pengujian, dan juga pembersihan setelah menyelesaikan pengujian. TestNG menyediakan sejumlah fitur inisialisasi dan pembersihan di tingkat metode, kelas, grup, dan suite:

@BeforeClass public void setup() { number = 12; } @AfterClass public void tearDown() { number = 0; }

Metode setup () yang dianotasi dengan anotasi @BeforeClass akan dipanggil sebelum eksekusi metode apa pun dari kelas pengujian tersebut, dan tearDown () setelah mengeksekusi semua metode kelas pengujian.

Demikian pula, kita dapat menggunakan anotasi @BeforeMethod, @AfterMethod, @ Before / AfterGroup, @ Before / AfterTest dan @ Before / AfterSuite untuk konfigurasi apa pun di tingkat metode, grup, pengujian, dan suite.

5. Eksekusi Uji

Kita dapat menjalankan kasus uji dengan perintah "test" Maven, ini akan menjalankan semua kasus uji yang dianotasi dengan @Test, menempatkannya ke rangkaian uji default. Kami juga dapat menjalankan kasus uji dari file XML rangkaian pengujian TestNG, dengan menggunakan maven-surefire-plugin:

 org.apache.maven.plugins maven-surefire-plugin 2.19.1    src\test\resources\test_suite.xml    

Perhatikan bahwa jika kita memiliki beberapa file XML, yang mencakup semua kasus uji, kita dapat menambahkan semuanya di tag suiteXmlFiles :

  src/test/resources/parametrized_test.xml   src/test/resources/registration_test.xml  

Untuk menjalankan pengujian secara mandiri, kita perlu memiliki pustaka TestNG di jalur kelas dan kelas pengujian yang dikompilasi bersama dengan file konfigurasi XML:

java org.testng.TestNG test_suite.xml

6. Tes Pengelompokan

Pengujian dapat dijalankan dalam kelompok, misalnya dari 50 kasus pengujian, 15 dapat dikelompokkan bersama dan dijalankan membiarkan yang lain sebagaimana adanya.

Dalam pengujian pengelompokan TestNG dalam rangkaian dilakukan menggunakan file XML:

Perhatikan bahwa, kedua kelas pengujian RegistrationTest, SignInTest sekarang termasuk dalam rangkaian yang sama dan setelah rangkaian dijalankan, kasus pengujian di kelas ini akan dijalankan.

Selain rangkaian pengujian, kami juga dapat membuat grup pengujian di TestNG, di mana metode kelas pengujian dikelompokkan bersama. Untuk melakukannya, tambahkan parameter grup di anotasi @Test :

@Test(groups = "regression") public void givenNegativeNumber_sumLessthanZero_thenCorrect() { int sum = numbers.stream().reduce(0, Integer::sum); assertTrue(sum < 0); }

Mari gunakan XML untuk mengeksekusi grup:

Ini akan menjalankan metode pengujian yang diberi tag dengan regresi grup , di kelas SummationServiceTest .

7. Pengujian Parameter

Pengujian unit berparameterisasi digunakan untuk menguji kode yang sama dalam beberapa kondisi. Dengan bantuan pengujian unit berparameter, kita dapat menyiapkan metode pengujian yang memperoleh data dari beberapa sumber data. Ide utamanya adalah membuat metode pengujian unit dapat digunakan kembali dan menguji dengan serangkaian input yang berbeda.

Di TestNG, kita dapat melakukan parametrize pengujian menggunakan anotasi @ Parameter atau @DataProvider . Saat menggunakan file XML, beri anotasi pada metode pengujian dengan @ Parameter:

@Test @Parameters({"value", "isEven"}) public void givenNumberFromXML_ifEvenCheckOK_thenCorrect(int value, boolean isEven) { assertEquals(isEven, value % 2 == 0); }
Dan sediakan datanya menggunakan file XML:

Menggunakan data dari file XML memang berguna, tetapi seringkali kita membutuhkan data yang lebih kompleks. Anotasi @DataProvider digunakan untuk menangani skenario ini, yang dapat digunakan untuk memetakan jenis parameter kompleks untuk metode pengujian. @DataProvider untuk tipe data primitif:

@DataProvider(name = "numbers") public static Object[][] evenNumbers() { return new Object[][]{{1, false}, {2, true}, {4, true}}; } @Test(dataProvider = "numbers") public void givenNumberFromDataProvider_ifEvenCheckOK_thenCorrect(Integer number, boolean expected) { assertEquals(expected, number % 2 == 0); }

@DataProvider untuk objek:

@Test(dataProvider = "numbersObject") public void givenNumberObjectFromDataProvider_ifEvenCheckOK_thenCorrect(EvenNumber number) { assertEquals(number.isEven(), number.getValue() % 2 == 0); } @DataProvider(name = "numbersObject") public Object[][] parameterProvider() { return new Object[][]{{new EvenNumber(1, false)}, {new EvenNumber(2, true)}, {new EvenNumber(4, true)}}; }

Dengan menggunakan ini, objek apa pun yang harus diuji dapat dibuat dan digunakan dalam pengujian. Ini sebagian besar berguna untuk kasus uji integrasi.

8. Mengabaikan Kasus Uji

Terkadang kami tidak ingin menjalankan kasus uji tertentu, untuk sementara selama proses pengembangan. Ini dapat dilakukan dengan menambahkan enabled = false, di anotasi @ Test :

@Test(enabled=false) public void givenNumbers_sumEquals_thenCorrect() { int sum = numbers.stream.reduce(0, Integer::sum); assertEquals(6, sum); }

9. Tes Ketergantungan

Mari pertimbangkan sebuah skenario, di mana jika kasus pengujian awal gagal, semua kasus pengujian berikutnya harus dijalankan, dan ditandai sebagai dilewati. TestNG menyediakan fitur ini dengan dependsOnMethods parameter @ Test penjelasan:

@Test public void givenEmail_ifValid_thenTrue() { boolean valid = email.contains("@"); assertEquals(valid, true); } @Test(dependsOnMethods = {"givenEmail_ifValid_thenTrue"}) public void givenValidEmail_whenLoggedIn_thenTrue() { LOGGER.info("Email {} valid >> logging in", email); }

Notice that, the login test case depends on the email validation test case. Thus, if email validation fails the login test will be skipped.

10. Concurrent Test Execution

TestNG allows tests to run in parallel or in multi-threaded mode, thus providing a way to test these multi-threaded pieces of code.

You can configure, for methods, classes, and suites to run in their own threads reducing the total execution time.

10.1. Classes and Methods in Parallel

To run test classes in parallel, mention the parallel attribute in the suite tag in XML configuration file, with value classes:

Note that, if we have multiple test tags in the XML file, these tests can also be run in parallel, by mentioning parallel =” tests”. Also to execute individual methods in parallel, mention parallel =” methods”.

10.2. Multi-Threaded Execution of Test Method

Let's say we need to test the behavior of a code when running in multiple threads. TestNG allows to run a test method in multiple threads:

public class MultiThreadedTests { @Test(threadPoolSize = 5, invocationCount = 10, timeOut = 1000) public void givenMethod_whenRunInThreads_thenCorrect() { int count = Thread.activeCount(); assertTrue(count > 1); } }

The threadPoolSize indicates that the method will run in n number of threads as mentioned. The invocationCount and timeOut indicate that the test will be executed multiple times and fail the test if it takes more time.

11. Functional Testing

TestNG hadir dengan fitur yang dapat digunakan untuk pengujian fungsional juga. Dalam hubungannya dengan Selenium, ini dapat digunakan untuk menguji fungsionalitas aplikasi web atau digunakan untuk menguji layanan web dengan HttpClient.

Rincian lebih lanjut tentang pengujian fungsional dengan Selenium dan TestNG tersedia di sini. Juga beberapa hal lagi tentang pengujian integrasi dalam artikel ini.

12. Kesimpulan

Pada artikel ini, kami telah melihat sekilas cara menyiapkan TestNG dan menjalankan kasus pengujian sederhana, menghasilkan laporan, eksekusi kasus pengujian secara bersamaan, dan juga sedikit tentang pemrograman fungsional. Untuk lebih banyak fitur seperti pengujian dependen, mengabaikan kasus pengujian, grup pengujian, dan suite, Anda dapat merujuk artikel JUnit vs TestNG kami di sini.

Penerapan semua potongan kode dapat ditemukan di Github.