Birden fazla test senaryosunu nasıl çalıştırabilirim? TestNG süit

⚡ Akıllı Özet

Birden Fazla Test Durumunu Çalıştırın TestNG Süitte Selenium Bu kılavuz, tek bir testng.xml dosyasından birden fazla sınıfı, paketi veya alt test grubunu tetiklemenizi sağlar. Bu rehber, modern testler için paralel iş parçacıkları, test grubu hiyerarşisi, raporlama ve yapay zeka desteğini kapsamaktadır. TestNG 7.x projeleri.

  • 🧵 Paralel İş Parçacıkları: Tüm tarayıcılarda ve paketlerde genel çalışma süresini önemli ölçüde azaltmak için thread-count ve parallel="tests" ayarlarını yapın.
  • 🗂️ Süit Hiyerarşisi: Üst dosya olan testng.xml, birden fazla test paketini tek bir tetikleyici içinde zincirlemek için alt paket dosyası girdilerini listeleyebilir.
  • ⚙️ TestNG 7.x Hazır: Örnekler şunlarla uyumludur: TestNG 7.10 ve Selenium 4 adet W3C sürücüsü, eski sürücülerin yerini alıyor. FirefoxSürücü kablolaması.
  • 📊 Akıllı Raporlama: 1'den 10'a kadar ayrıntılı seviyeler ve e-posta ile gönderilebilen HTML raporları, başarısız paralel iş parçacıklarını hızlı bir şekilde teşhis etmeye yardımcı olur.
  • 🤖 Yapay Zeka Orkestrasyonu: Yapay zekâ destekli zamanlayıcılar, geçmişteki hata ve süre verilerine dayanarak paketleri yeniden sıralar, yeniden dener ve parçalara ayırır.

Birden Fazla Test Durumunu Çalıştırın TestNG Süitte Selenium

TestNG Bu özellik, tek bir proje içinde test yöntemlerini, sınıfları ve tam test paketlerini paralel olarak çalıştırmanıza olanak tanır. Paralel yürütme, iş parçacıklarının testleri birbiri ardına değil, eş zamanlı olarak başlatması nedeniyle toplam çalışma süresini azaltır. Bu kılavuz, birden fazla sınıfı (farklı test paketlerini) nasıl çalıştıracağınızı açıklar. TestNG 7.x ile Selenium WebDriver.

Adım 1) Oluşturma TestNGTestlerin yürütülmesi için kullanılan .xml dosyası.

Yapılandırmayı oluşturmak için aşağıdaki adımları izleyin.

  1. İçinde yeni bir proje oluşturun Eclipse.
  2. Proje içerisinde iki paket oluşturun (bunlara isim verin). com.suite1 hem de com.suite2).
  3. Her pakette bir sınıf oluşturun (onlara isim verin) Flipkart.java hem de Snapdeal.javaAşağıdaki kodu ilgili sınıflara kopyalayın.
  4. Projenizde yeni bir dosya oluşturun ve ona bir isim verin. testng.xml. Emin ol TestNG Eklenti yüklendi (talimatlar mevcuttur) okuyuntestng.xml dosyası, sınıf adları, test adları ve test paketi adları gibi tüm yapılandırmaları içerir.

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>

Projenin nihai yapısı aşağıdaki örnekteki gibi görünmektedir.

Bir oluşturma TestNGTestin Yürütülmesi için .xml Dosyası

Adım 2) Paralel yürütme TestNG

Yukarıdaki XML dosyasını kaydettikten sonraki adım, paralel testleri çalıştırmaktır. Kod aşağıda gösterilmiştir.

Paralel Yürütme TestNG

1) iş parçacığı sayımı: Kaç iş parçacığı kullanılacağını tanımlar TestNG Paralel yürütme için başlatılabilir. Daha yüksek bir değer, CPU sınırına kadar aynı anda daha fazla test çalıştırır.

2) ayrıntılıKonsola işlem detaylarını kaydeder. İzin verilen değerler 1 ile 10 arasındadır. Daha yüksek değerler daha detaylı ve kapsamlı kayıtlar üretir.

3) isimSüitin adı. İşte burada:Gmail Süit”.

4) paralel: Anlatıyor TestNG Eş zamanlı olarak çalıştırılacak işlemler. Geçerli değerler testler, sınıflar, metotlar veya örneklerdir. Varsayılan değer şudur: Yok.

testng.xml dosyasına sağ tıklayın ve seçin. Çalıştır > TestNG süitİşlem tamamlandığında, birleştirilmiş sonuçları göreceksiniz.

Yukarıdaki kodu çalıştırdığınızda aşağıdaki çıktıyı alacaksınız.

Çıktı:

Paralel Yürütme TestNG

1) testng.xml dosyasında tanımlanan test paketinin adı.

Paralel Yürütme TestNG

2) testng.xml dosyasında tanımlanan testin adı.

Paralel Yürütme TestNG

3) testng.xml dosyasında tanımlanan sınıfın adı.

Paralel Yürütme TestNG

4) .java dosyasında @Test ile işaretlenmiş metot adları.

Paralel Yürütme TestNG

SnapDeal testi için de aynı akış geçerlidir, bu nedenle her iki sınıf da yan yana yürütülür.

Adım 3) Tek bir ana testng.xml dosyasından birden fazla test paketini çalıştırmak

Daha büyük projelerde sıkça karşılaşılan bir gereksinim, birden fazla testng.xml dosyasını tek bir tetikleyiciye bağlamaktır. TestNG 7.x, alt paketlere referans veren bir üst paketi destekler. süit dosyası Her alt işlem kendi iş parçacığı sayısını, dinleyicilerini ve parametrelerini koruyabilsin diye, girişler oluşturun. Her alt işlem paketini ayrı ayrı kaydedin, ardından üst işlemi onun yoluna yönlendirin. Yalnızca üst dosyayı çalıştırın. EclipseMaven veya komut satırı aracılığıyla.

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

Bu model, regresyon, smoke ve sanity test paketlerini ayrı tutar ancak yeniden kullanılabilir hale getirir. Ayrıca, Maven Surefire üzerinden ana dosyayı tetiklemek için de ayar yapabilirsiniz. <suiteXmlFile>parent-suite.xml</suiteXmlFile> Eklenti yapılandırmasının içinde yer alan bu özellik, sürekli entegrasyon işlem hatlarında aynı paralel düzenin çalışmasını sağlar.

Adım 4) Paralel işlemler için en iyi uygulamalar TestNG ishal

  • Pin TestNG 7 kere: Kullanım TestNG 7.10 veya daha yeni bir sürümle Selenium 4. Böylece W3C uyumlu sürücüler, farklı iş parçacıklarında tutarlı bir şekilde davranır.
  • Paylaşılan durumdan kaçının: Taşı Web Sürücüsü Bu alanı bir ThreadLocal'a dönüştürün, böylece her iş parçacığı kendi oturumunu tutabilir.
  • İplik sayısını ayarlayın: Önce işlemci çekirdek sayısıyla başlayın, ardından e-posta ile gönderilebilen HTML raporunu ve Grid'i yükleyin, daha sonra sayıyı artırın.
  • Test verilerini izole edin: Her konu için benzersiz kullanıcılar, sepetler ve PIN kodları kullanın, böylece oturum açma işlemleri asla çakışmaz.
  • Başarısızlık durumunda ekran görüntüleri alın: Bunları bir yolla bağlayın. ITestListener Kararsız paralel çalıştırmaları daha hızlı hata ayıklamak için.
  • Yapay zekâ desteğinden yararlanın: Gibi araçlar TestimMabl ve CodiumAI, istikrarsız testleri işaretleyebilir ve bir sonraki çalıştırmadan önce istikrarlı seçiciler önerebilir.

Sonuç

Yukarıdaki örnek, nasıl kullanılacağını göstermektedir. TestNG paralel testleri yürütmek için. TestNG 7.x sürümü, birden fazla test sınıfını başlatmak, çeşitli alt paketleri bağlamak ve paralel iş parçacıklarını ayarlamak için tek bir XML dosyası sunar, bu nedenle büyük ölçekli testler için idealdir. Selenium Projeler çok daha hızlı tamamlanıyor.

SSS

Her sınıfı kendi kategorisine yerleştirin. testng.xml dosyasındaki etiketi ekleyin, ardından parallel="tests" özelliğini ve en az 2 iş parçacığı sayısını ayarlayın. TestNG Bu, her iki testi de ayrı iş parçacıklarında başlatır, böylece sınıflar ardışık olarak değil, eş zamanlı olarak yürütülür.

Evet. İçindeki alt dosyaları listeleyen bir üst dosya oluşturun. Her bir alt paket dosya yolu kendi yapılandırmasını çalıştırır. Bu model şu şekilde çalışır: EclipseMaven Surefire ve Gradleve şu kuruluşlar tarafından desteklenmektedir: TestNG 6 ve sonrası, mevcut 7.x sürümü de dahil.

Paralel özniteliği testleri, sınıfları, metotları, örnekleri veya hiçbirini kabul eder. Her biri için testleri seçin. `@Test` etiketi kendi içinde bağımsızdır, `classes` tüm sınıf izolasyonu içindir ve `@Test` yöntemlerinin her biri iş parçacığı açısından güvenli olduğunda `methods` kullanılır. Varsayılan değer `none`'dır ve her şey sırayla çalışır.

ThreadLocal kullanın. Veya sürücüyü statik bir alan olarak değil, bir `@BeforeMethod` bloğu içinde başlatın. Bu sayede her iş parçacığı kendi tarayıcı oturumuna sahip olur ve bu da paralel çalıştırmayı çökertebilecek yarış koşullarını ortadan kaldırır. TestNG çalışır Selenium Kafes.

Yapay zekâ düzenleyicileri, önceki çalıştırma verilerini inceleyerek hataları tahmin eder, istikrarsız testleri ayırır ve yavaş olanları yeniden sıralar. Launchable gibi platformlar, Testimve mabl fişi TestNG Bu sayede, başarısız olma olasılığı en yüksek olan test paketleri önce çalıştırılır; bu da sürekli entegrasyon sunucularındaki geri bildirim döngülerini kısaltır.

Evet. Launchable ve BuildPulse'daki yapay zeka destekli zamanlayıcılar, test başına geçmiş süre ve hata oranını ölçer, ardından testng.xml dosyasını dengeli parçalara ayırır. Her parça ayrı bir ajan üzerinde çalışır, bu nedenle toplam gerçek zaman azalırken paralel kullanım yüksek kalır.

Bu yazıyı şu şekilde özetleyin: