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.

  • ๐Ÿงต Benang Paralel: Atur thread-count dan parallel=โ€testsโ€ untuk mengurangi waktu eksekusi keseluruhan di seluruh browser dan paket.
  • ๏ธ Hierarki Suite: File testng.xml induk dapat mencantumkan entri suite-file anak untuk menghubungkan beberapa suite dalam satu pemicu.
  • โš™๏ธ TestNG 7.x Siap: Contoh-contoh tersebut selaras dengan TestNG 7.10 dan Selenium 4 driver W3C, menggantikan driver lama. FirefoxPengkabelan driver.
  • ๐Ÿ“Š Pelaporan Cerdas: Tingkat detail 1 hingga 10 dan laporan HTML yang dapat dikirim melalui email membantu mendiagnosis kegagalan thread paralel dengan cepat.
  • ๐Ÿค– Orkestrasi AI: Penjadwal berbasis AI menyusun ulang, mencoba lagi, dan memecah rangkaian tugas berdasarkan data historis tentang kegagalan dan durasi.

Jalankan Beberapa Kasus Uji dengan TestNG Suite di Selenium

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.

  1. Buat proyek baru di Eclipse.
  2. Buat dua paket dalam proyek (beri nama paket tersebut) com.suite1 ke com.suite2).
  3. 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.
  4. 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.

Membuat TestNGFile .xml untuk Menjalankan Tes

Langkah 2) Eksekusi paralel di TestNG

Setelah menyimpan file XML di atas, langkah selanjutnya adalah menjalankan pengujian paralel. Kode tersebut ditunjukkan di bawah ini.

Eksekusi Paralel di TestNG

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:

Eksekusi Paralel di TestNG

1) Nama suite yang didefinisikan dalam testng.xml.

Eksekusi Paralel di TestNG

2) Nama pengujian yang didefinisikan dalam testng.xml.

Eksekusi Paralel di TestNG

3) Nama kelas yang dideklarasikan dalam testng.xml.

Eksekusi Paralel di TestNG

4) Nama metode yang diberi anotasi @Test di dalam file .java.

Eksekusi Paralel di TestNG

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.

Pertanyaan Umum Demo Slot

Tempatkan setiap kelas di tempatnya masing-masing. Tambahkan tag di dalam testng.xml, lalu atur parallel=โ€testsโ€ dan thread-count minimal 2. TestNG Kedua pengujian dijalankan pada thread terpisah, sehingga kelas-kelas tersebut dieksekusi secara bersamaan, bukan secara berurutan.

Ya. Buat rangkaian induk yang mencantumkan file anak di dalamnya. Setiap jalur berkas suite anak menjalankan konfigurasinya sendiri. Pola ini bekerja dalam Eclipse, Maven Surefire, dan Gradle, dan didukung dari TestNG Mulai versi 6 dan seterusnya, termasuk rilis terbaru 7.x.

Atribut paralel menerima tes, kelas, metode, instance, atau tidak ada. Pilih tes ketika masing-masing Tag bersifat mandiri, kelas untuk isolasi seluruh kelas, dan metode ketika metode @Test individual aman untuk thread. Nilai defaultnya adalah none, yang menjalankan semuanya secara berurutan.

Gunakan ThreadLocal atau menginisialisasi driver di dalam blok @BeforeMethod alih-alih sebagai field statis. Setiap thread kemudian memiliki sesi browsernya sendiri, yang menghilangkan kondisi race yang menyebabkan crash pada proses paralel. TestNG berjalan Selenium Kotak.

Pengatur AI mempelajari data eksekusi sebelumnya untuk memprediksi kegagalan, mengisolasi pengujian yang tidak stabil, dan mengatur ulang urutan pengujian yang lambat. Platform seperti Launchable, Testim, dan mabl terhubung ke TestNG Dengan demikian, rangkaian pengujian yang paling mungkin gagal akan dijalankan terlebih dahulu, yang memperpendek siklus umpan balik pada server integrasi berkelanjutan.

Ya. Penjadwal berbasis AI di Launchable dan BuildPulse mengukur durasi historis dan tingkat kegagalan per pengujian, kemudian membagi testng.xml menjadi beberapa bagian yang seimbang. Setiap bagian berjalan pada agen terpisah, sehingga total waktu nyata berkurang sementara pemanfaatan paralel tetap tinggi.

Ringkaslah postingan ini dengan: