Kako pokrenuti više testnih slučajeva u TestNG Apartman

⚡ Pametni sažetak

Pokreni više testnih slučajeva s TestNG Apartman u Selenium omogućuje vam pokretanje nekoliko klasa, paketa ili podređenih paketa iz jedne datoteke testng.xml. Ovaj vodič pokriva paralelne niti, hijerarhiju paketa, izvještavanje i AI pomoć za moderno TestNG 7.x projekti.

  • 🧵 Paralelne niti: Postavite thread-count i parallel=”tests” kako biste smanjili ukupno vrijeme izvođenja u različitim preglednicima i paketima.
  • 🗂️ Hijerarhija apartmana: Roditeljska datoteka testng.xml može navesti unose podređenih datoteka paketa kako bi se više paketa povezalo u jednom okidaču.
  • ️ TestNG 7.x Spremno: Primjeri su u skladu s TestNG 7.10 i Selenium 4 W3C upravljačka programa, zamjenjujući naslijeđene FirefoxOžičenje vozača.
  • 📊 Pametno izvještavanje: Detaljna izvješća razina od 1 do 10 i HTML izvješća koja se mogu poslati e-poštom pomažu u brzoj dijagnostici neuspjelih paralelnih niti.
  • 🤖 Orkestracija umjetne inteligencije: Rasporedivači vođeni umjetnom inteligencijom mijenjaju redoslijed, ponovno pokušavaju i dijele pakete fragmenata na temelju povijesnih podataka o pahuljicama i trajanju.

Pokreni više testnih slučajeva s TestNG Apartman u Selenium

TestNG Omogućuje vam paralelno pokretanje metoda testiranja, klasa i punih paketa unutar jednog projekta. Paralelno izvršavanje smanjuje ukupno vrijeme izvođenja jer niti pokreću testove istovremeno umjesto jednu za drugom. Ovaj vodič objašnjava kako pokrenuti više klasa (različitih paketa) pomoću TestNG 7.x s Selenium WebDriver.

Korak 1) Stvaranje a TestNG.xml datoteka za izvršavanje testova

Za izradu konfiguracije slijedite dolje navedene korake.

  1. Izradi novi projekt u Eclipse.
  2. Napravite dva paketa u projektu (nazovite ih com.suite1 i com.suite2).
  3. Kreirajte klasu u svakom paketu (navedite ih Flipkart.java i Snapdeal.java) i kopirajte donji kod u odgovarajuće klase.
  4. Napravite novu datoteku u svom projektu i nazovite je testng.xml. Obavezno provjerite TestNG dodatak je instaliran (upute su dostupne ovdje). Datoteka testng.xml sadrži sve konfiguracije kao što su nazivi klasa, nazivi testova i nazivi paketa.

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>

Konačna struktura projekta izgleda kao u primjeru ispod.

Izrada a TestNG.xml datoteka za izvođenje testa

Korak 2) Paralelno izvođenje u TestNG

Nakon spremanja gore navedene XML datoteke, sljedeći korak je pokretanje paralelnih testova. Kod je prikazan u nastavku.

Paralelno izvođenje u TestNG

1) brojanje niti: Definira koliko niti TestNG može se pokrenuti za paralelno izvršavanje. Viša vrijednost pokreće više testova odjednom, do ograničenja CPU-a.

2) opširno: Zapisuje detalje izvršavanja u konzolu. Dopuštene vrijednosti kreću se od 1 do 10. Veće vrijednosti daju detaljnije i granularnije zapisnike.

3) imeNaziv apartmana. Evo ga "Gmail Apartman”.

4) paralelnoGovori TestNG što se izvršava istodobno. Valjane vrijednosti su testovi, klase, metode ili instance. Zadana vrijednost je nijedan.

Desnom tipkom miša kliknite datoteku testng.xml i odaberite Pokreni kao > TestNG ApartmanNakon što završi, vidjet ćete konsolidirane rezultate.

Kada izvršite gornji kod, dobit ćete sljedeći izlaz.

Izlaz:

Paralelno izvođenje u TestNG

1) Naziv paketa definiran u testng.xml.

Paralelno izvođenje u TestNG

2) Naziv testa definiran u testng.xml.

Paralelno izvođenje u TestNG

3) Naziv klase deklarirane u testng.xml.

Paralelno izvođenje u TestNG

4) Imena metoda označena s @Test u .java datoteci.

Paralelno izvođenje u TestNG

Isti tok se izvodi za SnapDeal test, tako da se obje klase izvršavaju paralelno.

Korak 3) Pokretanje više paketa iz jedne nadređene datoteke testng.xml

Uobičajeni zahtjev na većim projektima je povezivanje nekoliko datoteka testng.xml u jedan okidač. TestNG 7.x podržava roditeljski paket koji referencira podređeni datoteka-suite unose, tako da svako dijete može zadržati vlastiti broj niti, slušače i parametre. Spremite svaki paket djeteta zasebno, a zatim roditelja usmjerite na njegovu putanju. Pokrenite samo roditeljsku datoteku iz Eclipse, Maven ili naredbeni redak.

<!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>

Ovaj obrazac drži regresijski, smoke i sanity pakete odvojenima, ali ih je moguće ponovno koristiti. Također možete pokrenuti nadređenu datoteku iz Maven Surefirea postavljanjem <suiteXmlFile>parent-suite.xml</suiteXmlFile> unutar konfiguracije dodatka, što omogućuje da isti paralelni raspored radi u cjevovodima kontinuirane integracije.

Korak 4) Najbolje prakse za paralelno TestNG pokreće

  • bor TestNG 7.x: Koristiti TestNG 7.10 ili noviji s Selenium 4 tako da se upravljački programi kompatibilni s W3C-om ponašaju dosljedno u svim nitima.
  • Izbjegavajte dijeljeno stanje: Premjesti webdriver polje u ThreadLocal tako da svaka nit ima vlastitu sesiju.
  • Broj niti za podešavanje: Započnite s brojem jezgri procesora, a zatim pogledajte HTML izvješće koje se može poslati e-poštom i učitavanje mreže prije nego što ga povećate.
  • Izolirajte podatke testa: Koristite jedinstvene korisnike, košarice i PIN kodove po niti kako se prijave nikada ne bi sukobljavale.
  • Snimite snimke zaslona u slučaju neuspjeha: Pričvrstite ih putem ITestListener za brže otklanjanje grešaka u nestabilnim paralelnim izvršavanjima.
  • Koristite pomoć umjetne inteligencije: Alati poput Testim, mabl i CodiumAI mogu označiti nestabilne testove i predložiti stabilne selektore prije sljedećeg pokretanja.

Zaključak

Gornji primjer pokazuje kako se koristi TestNG za izvršavanje paralelnih testova. TestNG 7.x vam daje jednu XML datoteku za pokretanje više testnih klasa, povezivanje nekoliko podređenih paketa i podešavanje paralelnih niti, toliko velikih Selenium projekti završavaju puno brže.

Pitanja i odgovori

Postavite svaki razred na njegovo mjesto unutar testng.xml, zatim postavite parallel=”tests” i broj niti od najmanje 2. TestNG pokreće oba testa u odvojenim nitima, tako da se klase izvršavaju istovremeno, a ne sekvencijalno.

Da. Izradite roditeljski paket koji navodi podređene datoteke unutra Svaka putanja podređene datoteke paketa pokreće vlastitu konfiguraciju. Uzorak radi u Eclipse, Maven Surefire i Gradlei podržan je od strane TestNG 6 nadalje, uključujući trenutno izdanje 7.x.

Atribut parallel prihvaća testove, klase, metode, instance ili ništa. Odaberite testove kada svaki Oznaka je samostalna, klase za izolaciju cijele klase i metode kada su pojedinačne @Test metode sigurne za više niti. Zadana vrijednost je none, što sve pokreće sekvencijalno.

Koristite ThreadLocal ili inicijalizirajte upravljački program unutar bloka @BeforeMethod umjesto kao statičko polje. Svaka nit tada posjeduje vlastitu sesiju preglednika, što eliminira uvjete utrke koji paralelno uzrokuju pad sustava. TestNG radi na Selenium Mreža.

Orkestratori umjetne inteligencije proučavaju podatke o prethodnim izvođenjima kako bi predvidjeli neuspjehe, stavili u karantenu nestabilne testove i promijenili redoslijed sporih. Platforme poput Launchablea, Testimi mabl se uključi u TestNG pa se najvjerojatnije neuspješni paketi pokreću prvi, što skraćuje povratne petlje na poslužiteljima za kontinuiranu integraciju.

Da. Rasporedi pokretani umjetnom inteligencijom u Launchableu i BuildPulseu mjere povijesno trajanje i stopu prekida po testu, a zatim dijele testng.xml u uravnotežene fragmente. Svaki fragment radi na zasebnom agentu, tako da ukupno vrijeme rada na zidu pada, dok paralelna iskorištenost ostaje visoka.

Sažmite ovu objavu uz: