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.

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.
- İçinde yeni bir proje oluşturun Eclipse.
- Proje içerisinde iki paket oluşturun (bunlara isim verin). com.suite1 hem de com.suite2).
- 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.
- 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.
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.
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ı:
1) testng.xml dosyasında tanımlanan test paketinin adı.
2) testng.xml dosyasında tanımlanan testin adı.
3) testng.xml dosyasında tanımlanan sınıfın adı.
4) .java dosyasında @Test ile işaretlenmiş metot adları.
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.




