Pengenalan kepada TestNG

1. Gambaran keseluruhan

Dalam artikel ini, kami akan memperkenalkan kerangka ujian TestNG.

Kami akan memfokuskan pada: penyediaan kerangka, menulis kes ujian dan konfigurasi mudah, pelaksanaan ujian, penghasilan laporan ujian, dan pelaksanaan ujian serentak.

2. Persediaan

Mari mulakan dengan menambahkan kebergantungan Maven dalam fail pom.xml kami :

 org.testng testng 7.1.0 test 

Versi terbaru boleh didapati di repositori Maven.

Semasa menggunakan Eclipse, plugin TestNG boleh dimuat turun dan dipasang dari Eclipse Marketplace.

3. Menulis Kes Ujian

Untuk menulis ujian menggunakan TestNG, kami hanya perlu memberi penjelasan kaedah ujian dengan org.testng.annotations. Anotasi ujian :

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

4. Konfigurasi Ujian

Semasa menulis kes ujian, seringkali kita perlu melaksanakan beberapa arahan konfigurasi atau inisialisasi sebelum pelaksanaan ujian, dan juga beberapa pembersihan setelah menyelesaikan ujian. TestNG menyediakan sejumlah ciri inisialisasi dan pembersihan pada tahap kaedah, kelas, kumpulan dan suite:

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

Kaedah setup () yang dianotasi dengan @BeforeClass anotasi akan dipanggil sebelum pelaksanaan sebarang kaedah kelas ujian tersebut, dan tearDown () setelah melaksanakan semua kaedah kelas ujian.

Begitu juga, kita boleh menggunakan anotasi @BeforeMethod, @AfterMethod, @ Before / AfterGroup, @ Before / AfterTest dan @ Before / AfterSuite untuk sebarang konfigurasi pada peringkat kaedah, kumpulan, ujian dan suite.

5. Pelaksanaan Ujian

Kita dapat menjalankan kes ujian dengan perintah "test" Maven, ia akan menjalankan semua kes ujian yang diberi penjelasan dengan @Test memasukkannya ke suite ujian lalai. Kami juga dapat menjalankan kes ujian dari fail XML suite ujian TestNG, dengan menggunakan plugin maven-surefire:

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

Perhatikan bahawa jika kita mempunyai banyak fail XML, yang merangkumi semua kes ujian, kita dapat menambahkan semuanya dalam tag suiteXmlFiles :

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

Untuk menjalankan ujian secara mandiri, kita perlu mempunyai pustaka TestNG di classpath dan kelas ujian yang disusun bersama dengan fail konfigurasi XML:

java org.testng.TestNG test_suite.xml

6. Ujian Berkumpulan

Ujian dapat dijalankan secara berkumpulan, contohnya dari 50 kes ujian 15 dapat dikumpulkan bersama dan dilaksanakan meninggalkan yang lain sebagaimana adanya.

Dalam ujian pengelompokan TestNG di suite dilakukan menggunakan fail XML:

Perhatikan bahawa, kedua-dua kelas ujian RegistrationTest, SignInTest kini tergolong dalam suite yang sama dan setelah suite dijalankan, kes ujian di kelas ini akan dilaksanakan.

Selain daripada ujian, kami juga boleh membuat kumpulan ujian di TestNG, di mana bukannya kaedah ujian dikumpulkan bersama. Untuk melakukannya, tambahkan parameter kumpulan dalam 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 melaksanakan kumpulan:

Ini akan melaksanakan kaedah ujian yang ditandai dengan regresi kumpulan , di kelas SummationServiceTest .

7. Ujian Parameter

Ujian unit parameter digunakan untuk menguji kod yang sama dalam beberapa keadaan. Dengan bantuan ujian unit parameter, kita dapat menetapkan kaedah ujian yang memperoleh data dari beberapa sumber data. Idea utama adalah menjadikan kaedah ujian unit dapat digunakan semula dan diuji dengan satu set input yang berbeza.

Di TestNG, kita dapat menentukan parameter menggunakan anotasi @ Parameter atau @DataProvider . Semasa menggunakan fail XML anotasi kaedah ujian dengan @ Parameter:

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

Menggunakan data dari fail XML sangat berguna, tetapi kita sering memerlukan data yang lebih kompleks. Anotasi @DataProvider digunakan untuk menangani senario ini, yang dapat digunakan untuk memetakan jenis parameter kompleks untuk kaedah pengujian. @DataProvider untuk jenis 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, setiap objek yang harus diuji dapat dibuat dan digunakan dalam ujian. Ini sangat berguna untuk kes ujian integrasi.

8. Mengabaikan Kes Ujian

Kita kadang-kadang mahu tidak melaksanakan kes ujian tertentu, sementara semasa proses pembangunan. Ini boleh dilakukan dengan menambahkan enabled = false, dalam @ Uji anotasi:

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

9. Ujian Bergantung

Mari kita pertimbangkan senario, di mana jika kes ujian awal gagal, semua kes ujian berikutnya harus dijalankan, dan lebih baik ditandai sebagai dilangkau. TestNG menyediakan ciri ini dengan parameter dependOnMethods dari anotasi @Test :

@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 dilengkapi dengan ciri-ciri yang dapat digunakan untuk ujian fungsional juga. Bersama dengan Selenium, ia dapat digunakan untuk menguji fungsi aplikasi web atau digunakan untuk menguji perkhidmatan web dengan HttpClient.

Maklumat lebih lanjut mengenai ujian berfungsi dengan Selenium dan TestNG terdapat di sini. Juga beberapa lagi perkara mengenai pengujian integrasi dalam artikel ini.

12. Kesimpulannya

Dalam artikel ini, kami melihat sekilas bagaimana cara mengatur TestNG dan menjalankan kes ujian sederhana, menghasilkan laporan, pelaksanaan kes ujian bersamaan dan juga sedikit mengenai pengaturcaraan fungsional. Untuk lebih banyak ciri seperti ujian bergantung, mengabaikan kes ujian, kumpulan ujian dan suite, anda boleh merujuk artikel JUnit vs TestNG kami di sini.

Pelaksanaan semua coretan kod dapat dilihat di Github.