Cara Menjalankan Beberapa Kasus Uji di TestNG Rangkaian
โก Ringkasan Cerdas
Jalankan Beberapa Kasus Uji dengan TestNG Suite di Selenium Memungkinkan Anda untuk memicu beberapa kelas, paket, atau rangkaian turunan dari satu file testng.xml. Panduan ini mencakup thread paralel, hierarki rangkaian, pelaporan, dan bantuan AI untuk testng modern. TestNG Proyek 7.x.

TestNG Memungkinkan Anda menjalankan metode pengujian, kelas, dan rangkaian pengujian lengkap secara paralel dalam satu proyek. Eksekusi paralel menurunkan total waktu eksekusi karena thread memulai pengujian secara bersamaan, bukan satu per satu. Panduan ini menjelaskan cara menjalankan beberapa kelas (rangkaian pengujian yang berbeda) menggunakan TestNG 7.x dengan Selenium Pengemudi Web.
Langkah 1) Membuat a TestNGFile .xml untuk menjalankan pengujian
Untuk membuat konfigurasi, ikuti langkah-langkah di bawah ini.
- Buat proyek baru di Eclipse.
- Buat dua paket dalam proyek (beri nama paket tersebut) com.suite1 ke com.suite2).
- Buat kelas di setiap paket (beri nama pada kelas-kelas tersebut). Flipkart.java ke Snapdeal.java) dan salin kode di bawah ini ke dalam kelas masing-masing.
- Buat file baru di proyek Anda dan beri nama pengujian.xml. Pastikan TestNG Plugin sudah terpasang (petunjuk tersedia) di siniFile testng.xml berisi semua konfigurasi seperti nama kelas, nama pengujian, dan nama suite.
Flipkart.java
package com.suite1; import java.util.concurrent.TimeUnit; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class Flipkart { WebDriver driver = new FirefoxDriver(); String username = ""; // Change to your username and password String password = ""; // This method navigates to the Flipkart URL @BeforeClass public void init() { driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); driver.navigate().to("https://www.flipkart.com"); } // Log in to Flipkart @Test public void login() { driver.findElement(By.partialLinkText("Login")).click(); driver.findElement(By.cssSelector(".fk-input.login-form-input.user-email")).sendKeys(username); driver.findElement(By.cssSelector(".fk-input.login-form-input.user-pwd")).sendKeys(password); driver.findElement(By.cssSelector(".submit-btn.login-btn.btn")).click(); } // Search for a product @Test public void searchAndSelectProduct() { driver.findElement(By.id("fk-top-search-box")).sendKeys("moto g3"); driver.findElement(By.cssSelector("search-bar-submit.fk-font-13.fk-font-bold")).click(); String css = ".gd-row.browse-grid-row:nth-of-type(1) > div:nth-child(1)>div>div:nth-child(2)>div>a"; driver.findElement(By.cssSelector(css)).click(); } @Test public void buyAndRemoveFromCart() { driver.findElement(By.cssSelector(".btn-express-checkout.btn-big.current")).click(); driver.findElement(By.cssSelector(".remove.fk-inline-block")).click(); Alert a = driver.switchTo().alert(); a.accept(); } @Test public void logout() { Actions s = new Actions(driver); WebElement user = driver.findElement(By.partialLinkText(username)); s.moveToElement(user).build().perform(); driver.findElement(By.linkText("Logout")).click(); } @AfterClass public void quit() { driver.close(); } }
SnapDeal.java
package com.suite2; import java.util.concurrent.TimeUnit; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class SnapDeal { WebDriver driver = new FirefoxDriver(); String username = ""; // Change to your username and password String password = ""; String pinCode = ""; // This method navigates to the Snapdeal URL @BeforeClass public void init() { driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); driver.navigate().to("https://www.snapdeal.com"); } @Test public void login() { driver.findElement(By.xpath("//button[text()='Login']")).click(); driver.switchTo().frame("loginIframe"); driver.findElement(By.cssSelector("div[onClick='getLoginForm()']")).click(); driver.findElement(By.id("j_username")).sendKeys(username); driver.findElement(By.id("j_password_login")).sendKeys(password); driver.findElement(By.id("signin_submit")).click(); driver.switchTo().defaultContent(); } @Test public void searchAndSelectProduct() { driver.findElement(By.cssSelector(".col-xs-20.searchformInput.keyword")).sendKeys("iphone 6s"); driver.findElement(By.cssSelector(".sd-icon.sd-icon-search")).click(); String css = ".product_grid_row:nth-of-type(1)>div:nth-child(1)"; driver.findElement(By.cssSelector(css)).click(); } @Test public void buyAndRemoveFromCart() { driver.findElement(By.xpath("//li[contains(text(),'Silver')]")).click(); driver.findElement(By.id("pincode-check")).sendKeys(pinCode); driver.findElement(By.id("buy-button-id")).click(); driver.findElement(By.cssSelector("i[title='Delete Item']")).click(); Alert a = driver.switchTo().alert(); a.accept(); } @Test public void logout() { driver.findElement(By.linkText("START SHOPPING NOW")).click(); Actions s = new Actions(driver); WebElement user = driver.findElement(By.cssSelector(".sd-icon.sd-icon-user")); s.moveToElement(user).build().perform(); driver.findElement(By.linkText("Logout")).click(); } @AfterClass public void quit() { driver.close(); } }
TestNG. Xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite thread-count="2" verbose="1" name="Gmail Suite" parallel="tests"> <test name="flipkart"> <classes> <class name="com.suite1.Flipkart"/> </classes> </test> <test name="Myntra"> <classes> <class name="com.suite2.SnapDeal"/> </classes> </test> </suite>
Struktur proyek akhir akan terlihat seperti contoh di bawah ini.
Langkah 2) Eksekusi paralel di TestNG
Setelah menyimpan file XML di atas, langkah selanjutnya adalah menjalankan pengujian paralel. Kode tersebut ditunjukkan di bawah ini.
1) jumlah benang: Menentukan berapa banyak thread TestNG dapat dijalankan secara paralel. Nilai yang lebih tinggi menjalankan lebih banyak pengujian sekaligus, hingga batas CPU.
2) bertele-tele: Mencatat detail eksekusi di konsol. Nilai yang diizinkan berkisar dari 1 hingga 10. Nilai yang lebih tinggi menghasilkan log yang lebih detail dan terperinci.
3) nama: Nama suite-nya. Ini dia โGmail Suiteโ.
4) paralel: Memberitahu TestNG Apa yang akan dijalankan secara bersamaan. Nilai yang valid adalah tes, kelas, metode, atau instance. Nilai defaultnya adalah tak satupun.
Klik kanan pada file testng.xml dan pilih Jalankan Sebagai > TestNG RangkaianSetelah selesai, Anda akan melihat hasil gabungannya.
Ketika Anda mengeksekusi kode di atas, Anda akan mendapatkan keluaran berikut.
Keluaran:
1) Nama suite yang didefinisikan dalam testng.xml.
2) Nama pengujian yang didefinisikan dalam testng.xml.
3) Nama kelas yang dideklarasikan dalam testng.xml.
4) Nama metode yang diberi anotasi @Test di dalam file .java.
Alur yang sama berjalan untuk pengujian SnapDeal, sehingga kedua kelas dieksekusi secara bersamaan.
Langkah 3) Menjalankan beberapa suite dari satu file testng.xml induk
Persyaratan umum pada proyek yang lebih besar adalah menggabungkan beberapa file testng.xml menjadi satu pemicu tunggal. TestNG Versi 7.x mendukung rangkaian induk yang merujuk pada rangkaian anak. berkas suite entri, sehingga setiap anak dapat menyimpan jumlah thread, listener, dan parameternya sendiri. Simpan setiap suite anak secara terpisah, lalu arahkan induk ke jalurnya. Jalankan hanya file induk dari Eclipse, Maven, atau baris perintah.
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Parent Suite" parallel="tests" thread-count="4"> <suite-files> <suite-file path="./flipkart-suite.xml"/> <suite-file path="./snapdeal-suite.xml"/> </suite-files> </suite>
Pola ini menjaga agar rangkaian pengujian regresi, smoke test, dan sanity test tetap terpisah namun dapat digunakan kembali. Anda juga dapat memicu file induk dari Maven Surefire dengan mengatur <suiteXmlFile>parent-suite.xml</suiteXmlFile> di dalam konfigurasi plugin, yang membuat tata letak paralel yang sama berfungsi dalam pipeline integrasi berkelanjutan.
Langkah 4) Praktik terbaik untuk paralel TestNG berjalan
- pin TestNG 7.x: penggunaan TestNG 7.10 atau lebih baru dengan Selenium 4. Jadi, driver yang sesuai dengan standar W3C berperilaku konsisten di seluruh thread.
- Hindari berbagi status: Pindahkan webdriver ubah field menjadi ThreadLocal sehingga setiap thread memiliki sesinya sendiri.
- Sesuaikan jumlah benang: Mulailah dengan menghitung jumlah inti CPU, lalu perhatikan laporan HTML yang dapat dikirim melalui email dan proses pemuatan Grid sebelum menaikkannya.
- Mengisolasi data uji: Gunakan pengguna, keranjang belanja, dan kode PIN yang unik untuk setiap thread agar proses login tidak pernah bentrok.
- Ambil tangkapan layar jika terjadi kegagalan: Hubungkan mereka melalui sebuah Pendengar untuk mempercepat proses debugging pada eksekusi paralel yang tidak stabil.
- Gunakan bantuan AI: Alat-alat seperti Testim, mabl, dan CodiumAI dapat menandai pengujian yang tidak stabil dan menyarankan selektor yang stabil sebelum pengujian berikutnya.
Kesimpulan
Contoh di atas menunjukkan cara menggunakannya. TestNG untuk menjalankan pengujian paralel. TestNG Versi 7.x memberi Anda satu file XML untuk menjalankan beberapa kelas pengujian, menghubungkan beberapa rangkaian pengujian turunan, dan menyetel thread paralel, sehingga dapat menangani pengujian dalam skala besar. Selenium Proyek selesai jauh lebih cepat.




