Как запустить несколько тестовых случаев в TestNG Люкс
⚡ Умное резюме
Запустите несколько тестовых случаев с помощью TestNG Люкс в Selenium Позволяет запускать несколько классов, пакетов или дочерних наборов тестов из одного файла testng.xml. В этом пошаговом руководстве рассматриваются параллельные потоки, иерархия наборов тестов, отчетность и помощь ИИ для современных тестов. TestNG Проекты 7.x.

TestNG Позволяет запускать тестовые методы, классы и полные наборы тестов параллельно в рамках одного проекта. Параллельное выполнение сокращает общее время выполнения, поскольку потоки запускают тесты одновременно, а не один за другим. В этом руководстве объясняется, как запускать несколько классов (разные наборы тестов) с помощью этой функции. TestNG 7.x с Selenium ВебДрайвер.
Шаг 1) Создание TestNGXML-файл для выполнения тестов
Для создания конфигурации выполните следующие действия.
- Создать новый проект в 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) Названия методов в файле .java аннотированы с помощью @Test.
Аналогичный алгоритм выполняется и для теста SnapDeal, поэтому оба класса выполняются параллельно.
Шаг 3) Запуск нескольких наборов тестов из одного родительского файла testng.xml
В крупных проектах часто требуется объединить несколько файлов testng.xml в один триггер. TestNG В версии 7.x поддерживается родительский набор, который ссылается на дочерний. файл набора записи, чтобы каждый дочерний процесс мог хранить собственное количество потоков, слушателей и параметры. Сохраняйте каждый набор дочерних процессов отдельно, а затем укажите родительскому процессу путь к нему. Запускайте только родительский файл из 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.х: Используйте TestNG 7.10 или более поздняя версия с Selenium 4. Таким образом, драйверы, соответствующие стандартам W3C, будут работать согласованно во всех потоках.
- Избегайте использования общего состояния: Перемещение Вебдрайвер преобразуйте поле в ThreadLocal, чтобы каждый поток мог поддерживать собственную сессию.
- Настройка количества нитей: Начните с подсчета количества ядер процессора, затем понаблюдайте за загрузкой HTML-отчета, который можно отправить по электронной почте, и сетки, прежде чем повышать этот показатель.
- Выделить тестовые данные: Используйте уникальных пользователей, корзины и пин-коды для каждого потока, чтобы избежать конфликтов при входе в систему.
- Делайте скриншоты при возникновении ошибки: Прикрепите их с помощью ITestListener для более быстрой отладки нестабильных параллельных процессов.
- Воспользуйтесь помощью искусственного интеллекта: Такие инструменты, как Testimmabl и CodiumAI могут выявлять нестабильные тесты и предлагать стабильные селекторы перед следующим запуском.
Заключение
Приведенный выше пример показывает, как использовать TestNG для выполнения параллельных тестов. TestNG В версии 7.x используется один XML-файл для запуска нескольких тестовых классов, связывания нескольких дочерних наборов тестов и настройки параллельных потоков, что делает большие тестовые наборы слишком большими. Selenium Проекты завершаются гораздо быстрее.




