Как да изпълните множество тестови случаи в TestNG апартамент
⚡ Умно обобщение
Изпълнете множество тестови случаи с TestNG Апартамент в Selenium позволява ви да задействате няколко класа, пакета или дъщерни пакета от един файл testng.xml. Това ръководство обхваща паралелни нишки, йерархия на пакети, отчитане и помощ от изкуствен интелект за съвременни... TestNG 7.x проекти.
TestNG позволява ви да изпълнявате тестови методи, класове и пълни пакети паралелно в рамките на един проект. Паралелното изпълнение намалява общото време за изпълнение, защото нишките стартират тестовете едновременно, вместо една след друга. Това ръководство обяснява как да изпълнявате множество класове (различни пакети), използвайки TestNG 7.x с Selenium WebDriver.
Стъпка 1) Създаване на a TestNG.xml файл за изпълнение на тестове
За да създадете конфигурацията, следвайте стъпките по-долу.
- Създайте нов проект в Eclipse.
- Създайте два пакета в проекта (наименувайте ги com.suite1 намлява com.suite2).
- Създайте клас във всеки пакет (наименувайте ги Flipkart.java намлява Snapdeal.java) и копирайте кода по-долу в съответните класове.
- Създайте нов файл във вашия проект и го наименувайте testng.xml, Уверете се, че TestNG плъгинът е инсталиран (налични са инструкции) тук). Файлът testng.xml съдържа цялата конфигурация, като например имена на класове, имена на тестове и имена на пакети.
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>
Крайната структура на проекта изглежда като примера по-долу.
Стъпка 2) Паралелно изпълнение в TestNG
След като запазите XML файла по-горе, следващата стъпка е да изпълните паралелните тестове. Кодът е показан по-долу.
1) брой нишки: Определя колко нишки TestNG може да се завърти за паралелно изпълнение. По-висока стойност изпълнява повече тестове едновременно, до лимита на процесора.
2) многословен: Записва подробности за изпълнението в конзолата. Допустимите стойности са от 1 до 10. По-високите стойности водят до по-подробни и гранулирани лог файлове.
3) имеИме на апартамента. Ето го „Gmail Апартамент“.
4) паралелноРазказва TestNG какво да се изпълнява едновременно. Валидните стойности са тестове, класове, методи или екземпляри. Стойността по подразбиране е нито един.
Щракнете с десния бутон върху файла testng.xml и изберете Изпълни като > TestNG апартаментСлед като приключи, ще видите консолидираните резултати.
Когато изпълните горния код, ще получите следния изход.
Изход:
1) Име на пакета, дефиниран в testng.xml.
2) Име на теста, дефиниран в testng.xml.
3) Име на класа, деклариран в testng.xml.
4) Имената на методите, анотирани с @Test във .java файла.
Същият поток се изпълнява и за теста SnapDeal, така че и двата класа се изпълняват едновременно.
Стъпка 3) Изпълнение на множество пакети от един родителски файл testng.xml
Често срещано изискване при по-големи проекти е свързването на няколко файла testng.xml в един тригер. TestNG 7.x поддържа родителски пакет, който препраща към дете suite-file записи, така че всяко дете да може да запази свой собствен брой нишки, слушатели и параметри. Запазете всеки дъщерен пакет отделно, след което насочете родителя към неговия път. Изпълнете само родителския файл от Eclipse, Maven или командния ред.
<!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>
Този модел държи регресионните, димните и санити пакетите отделни, но все пак многократно използваеми. Можете също да задействате родителския файл от Maven Surefire, като зададете <suiteXmlFile>parent-suite.xml</suiteXmlFile> вътре в конфигурацията на плъгина, което прави същото паралелно оформление да работи в непрекъснати интеграционни конвейери.
Стъпка 4) Най-добри практики за паралелно TestNG работи
- щифт TestNG 7.x: употреба TestNG 7.10 или по-нова версия с Selenium 4, така че съвместимите с W3C драйвери да се държат последователно в различните нишки.
- Избягвайте споделеното състояние: Преместете уебдрайвер поле в ThreadLocal, така че всяка нишка да поддържа собствена сесия.
- Брой нишки за настройка: Започнете с броя на ядрата на процесора, след което гледайте HTML отчета, който може да се изпрати по имейл, и зареждането на Grid, преди да го увеличите.
- Изолиране на тестови данни: Използвайте уникални потребители, колички и ПИН кодове за всяка нишка, така че входните данни никога да не се сблъскват.
- Заснемане на екранни снимки при неуспех: Прикрепете ги чрез ITestListener за по-бързо отстраняване на грешки при нестабилни паралелни изпълнения.
- Използвайте помощ от изкуствен интелект: Инструменти като Testim, mabl и CodiumAI могат да сигнализират за нестабилни тестове и да предлагат стабилни селектори преди следващото изпълнение.
Заключение
Горният пример показва как да се използва TestNG да се изпълнят паралелни тестове. TestNG 7.x ви предоставя един XML файл за стартиране на множество тестови класове, свързване на няколко дъщерни пакета и настройване на паралелни нишки, толкова големи Selenium проектите завършват много по-бързо.





