TestNG — это мощная система автоматизации тестирования с открытым исходным кодом и широким набором функций, включая аннотации, провайдеры данных, групповое тестирование, определение приоритетов и многое другое.
Приоритизация в TestNG — это простой способ установить приоритет тест-кейсов и запускать их в нужном порядке. Эта функция особенно полезна при определении последовательности выполнения тест-кейсов, когда у вас несколько тест-кейсов или вы назначаете приоритет нескольким методам по сравнению с другими. Например, если вы хотите, чтобы сначала выполнялся сценарий входа в систему, а затем добавление товара в корзину, вам не нужно беспокоиться, поскольку TestNG все для этого предусмотрел.
В предыдущих блогах этой серии уроков по Selenium TestNG мы узнали, как установить TestNG, как использовать аннотации в TestNG и многое другое. В этом блоге мы рассмотрим, как установить приоритет тест-кейса в TestNG при выполнении автоматизированного тестирования Selenium.
Давайте начнем!
СОДЕРЖАНИЕ
Что такое приоритет теста в TestNG?
Синтаксис для использования приоритета теста в TestNG
Как установить приоритет тест-кейса в TestNG с помощью Selenium?
Проблема TestNG при параллельном запуске тестов с одинаковым приоритетом
Что такое приоритет теста в TestNG?
В TestNG приоритет — это атрибут, который помогает пользователям определить порядок, в котором они хотят, чтобы выполнялись тест-кейсы.
Когда у вас есть несколько тест-кейсов и вы хотите, чтобы они выполнялись в определенном порядке, вы можете использовать атрибут Приоритет (Priority) для установки приоритета теста в TestNG. Тест-кейсы выполняются в порядке возрастания в списке приоритетов, и, следовательно, тест-кейсы с более низким приоритетом всегда будут выполняться первыми.
Синтаксис для использования приоритета теста в TestNG
Чтобы установить приоритет тест-кейса в TestNG, необходимо добавить аннотацию @Test (priority=X). В приведенном ниже примере мы присвоили тест-кейсу приоритет 1.
@Test(priority = 1)
public void myTestCaseWithPriority() {
try {
System.out.println("I am in my first testcase with priority=1");
} catch (Exception e) {
}
}
Что такое приоритет по умолчанию в TestNG?
Приоритет теста по умолчанию в TestNG равен 0. Поэтому, когда вы не задаете приоритет теста в TestNG для тест-кейсов, TestNG присваивает им приоритет 0.
Например, у приведенного ниже тест-кейса нет установленного приоритета, и поэтому ему присваивается приоритет 0.
@Test
public void myTestCaseWithDefaultPriority() {
try {
System.out.println("I am in my first testcase with default priority");
} catch (Exception e) {
}
}
С сертификацией TestNG вы сможете проверить свои навыки в выполнении автоматизированного тестирования с помощью TestNG и вывести свою карьеру на новый уровень.
Вот краткий обзор сертификации TestNG от LambdaTest:
Как установить отрицательный приоритет в TestNG?
Если вы задаетесь вопросом, можем ли мы присвоить отрицательный приоритет любому тест-кейсу, то ответ — Да! Мы можем назначить отрицательный приоритет тестовым методам, когда хотим, чтобы они имели приоритет над теми, что стоят по умолчанию.
В приведенном ниже примере есть два метода тестирования, один из которых имеет приоритет по умолчанию 0, а другой — отрицательный приоритет, т.е. -1. Следовательно, метод тестирования с отрицательным приоритетом всегда будет выполняться первым, а затем метод тестирования с приоритетом по умолчанию.
@Test
public void myTestCaseWithDefaultPriority() {
try {
System.out.println("I am in my first testcase with default priority");
} catch (Exception e) {
}
}
@Test(priority = -1)
public void myTestCaseWithNegativePriority() {
try {
System.out.println("I am in my first testcase with negative priority");
} catch (Exception e) {
}
}
Также прочтите: How To Use DataProviders In TestNG [With Examples]
Как тестировать с одинаковым приоритетом в TestNG?
Вам наверняка интересно, что произойдет, если у вас есть тест-кейс, в котором все или некоторые методы имеют одинаковый приоритет. В таких случаях TestNG следует алфавитному порядку при их выполнении.
В приведенном ниже примере есть два тест-метода (a и b), и оба имеют одинаковый приоритет по умолчанию, равный 0. Поэтому порядок выполнения будет таким: метод a, а затем b.
@Test
public void a() {
try {
System.out.println("A");
} catch (Exception e) {
}
}
@Test
public void b() {
try {
System.out.println("B");
} catch (Exception e) {
}
}
Также прочтите: Parameterization In TestNG – DataProvider and TestNG XML (With Examples)
Как установить приоритет тест-кейса в TestNG с помощью Selenium?
В этом блоге мы расскажем о том, как установить приоритет тест-кейса в TestNG, мы изучили основы приоритета в TestNG. В этом разделе руководства по Selenium TestNG мы рассмотрим, как работает приоритет теста в TestNG или как установить приоритет тест-кейса в TestNG.
Сценарий проблемы:
Мы автоматизируем главную страницу Selenium Playground, предлагаемую LambdaTest, и последовательно выведем заголовки всех разделов.
LambdaTest — это автоматизированная платформа кроссбраузерного тестирования. Имея в своем арсенале более 2000 браузеров и ОС, она позволяет с легкостью управлять ручными и автоматизированными тестами в одном месте.
Реализация:
Мы запускаем сценарий проблемы четырьмя различными способами, перечисленными ниже:
Когда все методы не имеют приоритета
Когда все методы имеют приоритет
Когда все методы имеют одинаковый приоритет
Когда есть методы с приоритетом и без приоритета
Если вы только начинаете запускать сценарии TestNG с помощью Selenium WebDriver, вы можете обратиться к нашему блогу о создании проекта TestNG в Eclipse и запуске сценария Selenium Test.
Установка приоритета тест-кейса, когда методы не имеют приоритета в TestNG
В этом разделе руководства по Selenium TestNG мы рассмотрим, как установить приоритет тест-кейса в TestNG, когда все методы не имеют приоритета. Мы будем использовать пример кода автоматизации Selenium.
package LamdaTest;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Reporter;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
class SeleniumPlaygroundTestsWithoutPriority {
public String username = "YOUR USERNAME";
public String accesskey = "YOUR ACCESSKEY";
public static RemoteWebDriver driver = null;
public String gridURL = "@hub.lambdatest.com/wd/hub";
@BeforeClass
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "chrome");
capabilities.setCapability("version", "94.0");
capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one
capabilities.setCapability("build", "TestNGWithoutPriorityTests");
capabilities.setCapability("name", "TestNGWithoutPriorityTestsSample");
try {
driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);
} catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
Reporter.log("Logging into Selenium Playground", true);
driver.get("http://labs.lambdatest.com/selenium-playground/");
}
@Test
public void getFirstOptionName() {
try {
WebElement option1 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[1]"));
Reporter.log("The First Option Is: " + option1.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getSecondOptionName() {
try {
WebElement option2 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[2]"));
Reporter.log("The Second Option Is: " + option2.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getThirdOptionName() {
try {
WebElement option3 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[3]"));
Reporter.log("The Third Option Is: " + option3.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getFourthOptionName() {
try {
WebElement option4 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[4]"));
Reporter.log("The Fourth Option Is: " + option4.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getFifthOptionName() {
try {
WebElement option5 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[5]"));
Reporter.log("The Fifth Option Is: " + option5.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getSixthOptionName() {
try {
WebElement option6 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[6]"));
Reporter.log("The Sixth Option Is: " + option6.getText(), true);
} catch (Exception e) {
}
}
@AfterClass
public void closeBrowser() {
driver.close();
Reporter.log("Closing the browser", true);
}
}
Вы можете использовать приведенный ниже файл testng.xml для запуска вышеуказанного тестового класса.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNGPriorityTest">
<test name="TestNGPriorityTest" >
<classes>
<class name="LamdaTest.SeleniumPlaygroundTestsWithoutPriority">
</class>
</classes>
</test>
</suite>
Приведенный ниже pom.xml можно использовать для установки всех необходимых зависимостей.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>LambdaTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>4.0.0-alpha-7</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
<version>4.0.0-alpha-7</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
Также читайте: How To Group Test Cases In TestNG [with Examples]
Просмотр кода:
Импортированные зависимости: Здесь мы импортировали все необходимые классы, включая Desired Capabilities, Reporter Class и т.д., для использования соответствующих методов.
Класс Reporter является встроенным классом в TestNG и используется для регистрации сообщений в HTML-отчетах и стандартном выводе.
Вы можете обратиться к статье How to Use TestNG Reporter Class In Selenium, в которой подробно рассматривается Reporter Class.
Также читайте: How To Generate TestNG Reports In Jenkins?
2. Глобальные переменные: Здесь мы использовали онлайн Selenium Grid типа LamdaTest для проведения параллельного тестирования. Здесь вы можете заполнить значения для соответствующего имени пользователя и ключа доступа, которые можно получить, войдя в раздел профиля LamdaTest. Вы можете скопировать имя пользователя и токен доступа для использования в коде. Однако URL останется прежним, как показано ниже.
3. @BeforeClass(Setup Method): Здесь мы использовали LamdaTest Desired Capabilities Generator и установили необходимые возможности (имя браузера, версия, платформа и т.д.) для нашего Selenium Remote Web Driver.
Обратитесь к нашему подробному блогу, в котором подробно описаны важные аннотации TestNG, используемые для автоматизации веб-тестирования.
Наряду с установкой желаемых возможностей, мы регистрируемся в Selenium Playground в методе Before Class, чтобы использовать платформу для всех последующих методов тестирования, войдя в систему один раз.
Мы также регистрируем текстовое сообщение "Logging into Selenium Playground" в нашем HTML-отчете и стандартном выводе, используя метод класса Reporter.
4. @Test(getFirstOptionName): В этом методе мы получаем веб-элемент заголовка первой секции Selenium Playground, выделенной ниже. Затем мы печатаем текст того же веб-элемента, используя класс Reporter, на консоли и в HTML-отчете. Здесь текст веб-элемента, выводимый на консоль, будет Input Forms.
Поскольку приоритет явно не установлен, метод тестирования примет приоритет по умолчанию, равный 0.
Здесь мы использовали XPath в нашем тест-кейсе для всех веб-элементов. Вы можете получить XPath любого элемента, просто щелкнув правой кнопкой мыши на элементе → Inspect Option. Вы также можете обратиться к полному руководству по XPath в Selenium, чтобы понять, как максимально использовать XPath для доступа к веб-элементам в DOM.
5. @Test(getSecondOptionName): В этом методе мы получаем веб-элемент заголовка втором разделе Selenium Playground. Затем мы печатаем текст того же веб-элемента, используя класс Reporter, на консоли и в HTML-отчете. Здесь текст веб-элемента, выводимый на консоль, будет Progress Bars & Sliders. Метод тестирования здесь снова принимает приоритет по умолчанию 0.
6. @Test(getThirdOptionName): В этом методе мы получаем веб-элемент заголовка третьего раздела Selenium Playground. Затем мы печатаем текст этого же веб-элемента, используя класс Reporter на консоли и в HTML-отчете. Здесь текст веб-элемента, выводимый на консоль, будет Alerts & Modals. Метод теста принимает приоритет по умолчанию равным 0.
7. @Test(getFourthOptionName): В этом методе мы получаем веб-элемент заголовка четвертого раздела Selenium Playground. Затем мы печатаем текст того же веб-элемента, используя класс Reporter на консоли и в HTML-отчете. Здесь текст веб-элемента, выводимый на консоль, будет Date Pickers.
8. @Test(getFifthOptionName): В этом методе мы получаем веб-элемент заголовка пятого раздела Selenium Playground. Затем мы печатаем текст того же веб-элемента, используя класс Reporter на консоли и в HTML-отчете. Здесь текст веб-элемента, выведенный на консоль, будет иметь вид Table.
9. @Test(getSixthOptionName): В этом методе мы получаем веб-элемент заголовка шестого раздела Selenium Playground. Затем мы печатаем текст того же веб-элемента, используя класс Reporter на консоли и в HTML-отчете. Здесь текст веб-элемента, выводимый на консоль, будет List Box.
10. @AfterClass(closeBrowser): В этом методе мы просто закрываем браузер, запущенный до запуска класса, после выполнения всех методов тестирования.
Результаты:
Поскольку для всех вышеуказанных методов тестирования не был явно указан приоритет, TestNG присвоит им приоритет по умолчанию 0. Теперь, как объяснялось в разделе "Тесты с одинаковым приоритетом в TestNG", чтобы разделить все эти методы с одинаковым приоритетом, TestNG будет следовать алфавитному порядку при их выполнении. В результате вывод консоли будет выглядеть примерно так:
Далее вы можете проверить результаты выполнения вашего теста, опубликованные на LambdaTest Automation Dashboard.
Во время выполнения теста вы также можете видеть стриминг видео в реальном времени, а также другие детали, такие как логи или возникшие исключения.
Также читайте: TestNG Listeners In Selenium WebDriver With Examples
Установка приоритета тест-кейса, когда методы имеют приоритет в TestNG
В предыдущем разделе этого блога о том, как установить приоритет тест-кейса в TestNG, вы видели, что тестовые методы выполняются в алфавитном порядке, поскольку им назначен приоритет по умолчанию. Теперь давайте посмотрим, как поведет себя тот же тест-кейс, если мы явно назначим приоритет тестовым методам при выполнении автоматизированного тестирования Selenium.
package LamdaTest;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Reporter;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
class SeleniumPlaygroundTestsWithPriority {
public String username = "YOUR USERNAME";
public String accesskey = "YOUR ACCESSKEY";
public static RemoteWebDriver driver = null;
public String gridURL = "@hub.lambdatest.com/wd/hub";
@BeforeClass
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "chrome");
capabilities.setCapability("version", "93.0");
capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one
capabilities.setCapability("build", "TestNGWithPriorityTests");
capabilities.setCapability("name", "TestNGWithPriorityTestsSample");
try {
driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);
} catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
Reporter.log("Logging into Selenium Playground", true);
driver.get("http://labs.lambdatest.com/selenium-playground/");
}
@Test(priority = 1)
public void getFirstOptionName() {
try {
WebElement option1 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[1]"));
Reporter.log("The First Option Is: " + option1.getText(), true);
System.out.println("I am in my first testcase with priority=1");
} catch (Exception e) {
}
}
@Test(priority = 2)
public void getSecondOptionName() {
try {
WebElement option2 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[2]"));
Reporter.log("The Second Option Is: " + option2.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 3)
public void getThirdOptionName() {
try {
WebElement option3 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[3]"));
Reporter.log("The Third Option Is: " + option3.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 4)
public void getFourthOptionName() {
try {
WebElement option4 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[4]"));
Reporter.log("The Fourth Option Is: " + option4.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 5)
public void getFifthOptionName() {
try {
WebElement option5 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[5]"));
Reporter.log("The Fifth Option Is: " + option5.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 6)
public void getSixthOptionName() {
try {
WebElement option6 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[6]"));
Reporter.log("The Sixth Option Is: " + option6.getText(), true);
} catch (Exception e) {
}
}
@AfterClass
public void closeBrowser() {
driver.close();
Reporter.log("Closing the browser", true);
}
}
Приведенный ниже файл testng.xml может быть использован для запуска вышеуказанного класса Java.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNGPriorityTest">
<test name="TestNGPriorityTest" >
<classes>
<class name="LamdaTest.SeleniumPlaygroundTestsWithPriority">
</class>
</classes>
</test>
</suite>
Подробное описание кода:
В этом тест-кейсе сценарий остается таким же, как и в нашем первом примере, за исключением того, что здесь всем методам присвоен приоритет.
Результаты:
Поскольку всем тестовым методам были присвоены соответствующие приоритеты, TestNG будет тесты в порядке возрастания приоритетов. Следовательно, первым будет выполнен метод getFirstOptionName с приоритетом=1, затем getSecondOptionName с приоритетом=2 и так далее. В результате консольный вывод выглядит следующим образом:
Далее вы можете проверить результаты тестирования и логи в LamdaTest Automation Dashboard.
Установка приоритета тест-кейса, когда методы имеют одинаковый приоритет в TestNG
В предыдущем разделе этого блога о том, как установить приоритет тест-кейса в TestNG, мы увидели, как легко TestNG подбирает наши тестовые методы на основе их приоритета в порядке возрастания, но что если методы имеют одинаковый приоритет. Итак, давайте посмотрим, как будет выглядеть результат нашего теста, если одни и те же тестовые методы будут выполняться с одинаковым приоритетом.
В этом методе мы также присвоим отрицательный приоритет нескольким нашим тестовым методам.
package LamdaTest;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Reporter;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
class SeleniumPlaygroundTestsWithSamePriority {
public String username = "YOUR USERNAME";
public String accesskey = "YOUR ACCESSKEY";
public static RemoteWebDriver driver = null;
public String gridURL = "@hub.lambdatest.com/wd/hub";
@BeforeClass
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "chrome");
capabilities.setCapability("version", "93.0");
capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one
capabilities.setCapability("build", "TestNGWithSamePriorityTests");
capabilities.setCapability("name", "TestNGWithSamePriorityTestsSample");
try {
driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);
} catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
Reporter.log("Logging into Selenium Playground", true);
driver.get("http://labs.lambdatest.com/selenium-playground/");
}
@Test(priority = 1)
public void getFirstOptionName() {
try {
WebElement option1 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[1]"));
Reporter.log("The First Option Is: " + option1.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 1)
public void getSecondOptionName() {
try {
WebElement option2 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[2]"));
Reporter.log("The Second Option Is: " + option2.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 2)
public void getThirdOptionName() {
try {
WebElement option3 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[3]"));
Reporter.log("The Third Option Is: " + option3.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = -1)
public void getFourthOptionName() {
try {
WebElement option4 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[4]"));
Reporter.log("The Fourth Option Is: " + option4.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = -2)
public void getFifthOptionName() {
try {
WebElement option5 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[5]"));
Reporter.log("The Fifth Option Is: " + option5.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = -3)
public void getSixthOptionName() {
try {
WebElement option6 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[6]"));
Reporter.log("The Sixth Option Is: " + option6.getText(), true);
} catch (Exception e) {
}
}
@AfterClass
public void closeBrowser() {
driver.close();
Reporter.log("Closing the browser", true);
}
}
Вы можете использовать приведенный ниже файл testng.xml для запуска приведенного выше класса Java.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNGPriorityTest">
<test name="TestNGPriorityTest" >
<classes>
<class name="LamdaTest.SeleniumPlaygroundTestsWithSamePriority">
</class>
</classes>
</test>
</suite>
Подробное описание кода:
В этом тест-кейсе сценарий остается таким же, как в первом и втором примерах, за исключением того, что здесь всем методам присвоен приоритет, причем два из них имеют одинаковый приоритет, а нескольким присвоен отрицательный приоритет.
Давайте расшифруем, как будут выглядеть наши результаты. Здесь тестовому методу getSixthOptionName присвоен самый низкий приоритет -3, и поэтому он будет выбран первым, за ним следует getFifthOptionName с приоритетом = -2, а затем getFourthOptionName с приоритетом = -1.
После них идут два тестовых метода getFirstOptionName и getSecondOptionName с одинаковым приоритетом = 1. Следовательно, из этих двух методов первым будет выполнен getFirstOptionName, поскольку он идет первым по алфавиту, за ним следует getSecondOptionName. Последним будет выполнен метод getThirdOptionName, запущенный с приоритетом = 2.
Результаты:
Как и ожидалось, консольный вывод будет выглядеть следующим образом:
Далее вы можете проверить результаты тестирования и логи в LamdaTest Automation Dashboard.
Установка приоритета тест-кейса с приоритетными и неприоритетными методами в TestNG
В предыдущем разделе этого блога о том, как установить приоритет тест-кейса в TestNG, у нас были либо все тестовые методы без установленного приоритета, либо все запущенные с приоритетом. Но можем ли мы иметь в TestNG комбинацию как приоритетных, так и неприоритетных методов? Ответ - ДА.
Давайте рассмотрим пример тест-кейса и поймем, как TestNG будет выполнять наши тестовые методы в таких сценариях.
package LamdaTest;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Reporter;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
class SeleniumPlaygroundTestsWithAndWithoutPriority {
public String username = "YOUR USERNAME";
public String accesskey = "YOUR ACCESSKEY";
public static RemoteWebDriver driver = null;
public String gridURL = "@hub.lambdatest.com/wd/hub";
@BeforeClass
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "chrome");
capabilities.setCapability("version", "93.0");
capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one
capabilities.setCapability("build", "TestNGWithAndWithoutPriorityTests");
capabilities.setCapability("name", "TestNGWithAndWithoutPriorityTestsSample");
try {
driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);
} catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
Reporter.log("Logging into Selenium Playground", true);
driver.get("http://labs.lambdatest.com/selenium-playground/");
}
@Test
public void getFirstOptionName() {
try {
WebElement option1 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[1]"));
Reporter.log("The First Option Is: " + option1.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getSecondOptionName() {
try {
WebElement option2 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[2]"));
Reporter.log("The Second Option Is: " + option2.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 1)
public void getThirdOptionName() {
try {
WebElement option3 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[3]"));
Reporter.log("The Third Option Is: " + option3.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 1)
public void getFourthOptionName() {
try {
WebElement option4 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[4]"));
Reporter.log("The Fourth Option Is: " + option4.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 0)
public void getFifthOptionName() {
try {
WebElement option5 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[5]"));
Reporter.log("The Fifth Option Is: " + option5.getText(), true);
} catch (Exception e) {
}
}
@Test(priority = 2)
public void getSixthOptionName() {
try {
WebElement option6 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[6]"));
Reporter.log("The Sixth Option Is: " + option6.getText(), true);
} catch (Exception e) {
}
}
@AfterClass
public void closeBrowser() {
driver.close();
Reporter.log("Closing the browser", true);
}
}
Вы можете использовать приведенный ниже testng.xml для запуска класса Java.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNGPriorityTest">
<test name="TestNGPriorityTest" >
<classes>
<class name="LamdaTest.SeleniumPlaygroundTestsWithAndWithoutPriority">
</class>
</classes>
</test>
</suite>
Подробное описание кода:
В этом тестовом-кейсе сценарий остается тем же, что мы видели до сих пор, за исключением того, что некоторым методам здесь был присвоен приоритет, а некоторые работают с приоритетом по умолчанию.
Давайте посмотрим, как будут выглядеть наши результаты. Здесь тестовому методу getFifthOptionName был присвоен приоритет =0, но он по-прежнему находится на том же уровне, что и методы getFirstOptionName и getSecondOptionName, поскольку, хотя им не был явно присвоен приоритет, они будут работать с приоритетом по умолчанию, который равен 0. Следовательно, из всех этих трех методов первым будет запущен getFifthOptionName, затем getFirstOptionName и getSecondOptionName, учитывая их алфавитный порядок. После них будет выполнен тестовый метод getFourthOptionName, затем getThirdOptionName, поскольку оба они имеют одинаковый приоритет, равный 1. В конце будет выполнен getSixthOptionName, поскольку он работает с приоритетом 2.
Результаты:
Как и ожидалось, консольный вывод будет выглядеть следующим образом:
Далее вы можете проверить результаты тестирования и логи в LamdaTest Automation Dashboard.
Проблема TestNG при запуске тестов с одинаковым приоритетом и в параллельном режиме
Мы рассмотрели, как установить приоритет кейса в TestNG и как приоритет TestNG работал в различных сценариях, когда у них был установлен одинаковый или разный приоритет или даже когда приоритет не был установлен. Однако сценарии, в которых методам назначен одинаковый приоритет, могут вести себя немного по-другому, если вы будете запускать их параллельно.
Вы можете обратиться к статье Создание XML-файла TestNG и выполнение параллельного тестирования, в которой подробно рассматриваются детали параллельного тестирования в TestNG с использованием XML-файла TestNG.
Например, если мы используем тот же тест-кейс, где все методы не имеют явно заданного приоритета, что означает, что они выполняются с приоритетом по умолчанию, т.е. 0, но вместо последовательного запуска тестовых методов, давайте запустим их параллельно и посмотрим, как будет выглядеть результат.
package LamdaTest;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Reporter;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
class SeleniumPlaygroundTestsWithoutPriority {
public String username = "YOUR USERNAME";
public String accesskey = "YOUR ACCESSKEY";
public static RemoteWebDriver driver = null;
public String gridURL = "@hub.lambdatest.com/wd/hub";
@BeforeClass
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "chrome");
capabilities.setCapability("version", "94.0");
capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one
capabilities.setCapability("build", "TestNGWithoutPriorityTests");
capabilities.setCapability("name", "TestNGWithoutPriorityTestsSample");
try {
driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);
} catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
Reporter.log("Logging into Selenium Playground", true);
driver.get("http://labs.lambdatest.com/selenium-playground/");
}
@Test
public void getFirstOptionName() {
try {
WebElement option1 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[1]"));
Reporter.log("The First Option Is: " + option1.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getSecondOptionName() {
try {
WebElement option2 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[2]"));
Reporter.log("The Second Option Is: " + option2.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getThirdOptionName() {
try {
WebElement option3 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[3]"));
Reporter.log("The Third Option Is: " + option3.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getFourthOptionName() {
try {
WebElement option4 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[4]"));
Reporter.log("The Fourth Option Is: " + option4.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getFifthOptionName() {
try {
WebElement option5 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[5]"));
Reporter.log("The Fifth Option Is: " + option5.getText(), true);
} catch (Exception e) {
}
}
@Test
public void getSixthOptionName() {
try {
WebElement option6 = driver.findElement(By.xpath("(//div[@class='contentlearn']//h2)[6]"));
Reporter.log("The Sixth Option Is: " + option6.getText(), true);
} catch (Exception e) {
}
}
@AfterClass
public void closeBrowser() {
driver.close();
Reporter.log("Closing the browser", true);
}
}
Давайте воспользуемся приведенным ниже файлом testng.xml и запустим тот же класс параллельно с thread-count 6.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNGPriorityTest" parallel="methods" thread-count="6" >
<test name="TestNGPriorityTest">
<classes>
<class name="LamdaTest.SeleniumPlaygroundTestsWithoutPriority">
/class>
</classes>
</test>
</suite>
Результаты выполнения:
Теперь, в идеале, тестовые методы должны были выполняться в алфавитном порядке, поскольку все они имели приоритет по умолчанию 0. Так, getFifthOptionName
должен выполняться первым, затем getFirstOptionName
и так далее.
Также читайте: Speed Up Automated Parallel Testing In Selenium With TestNG
Фактические результаты:
Методы тестирования выполняются в случайной последовательности, а не в алфавитном порядке, поскольку мы запускаем их параллельно.
Вывод консоли показывает, что методы были выполнены в случайной последовательности.
Примечание: То же самое работает, если мы просто удалим атрибуты parallel и thread-count из нашего файла testng.xml.
Важно учесть, что с этой проблемой можно столкнуться только в том случае, если методы имеют одинаковый приоритет. Порядок выполнения остается точно таким же, как и ожидалось, когда эти методы выполняются с разными приоритетами и параллельно.
Заключение
В этом блоге о том, как установить приоритет тест-кейса в TestNG, мы узнали об атрибуте Приоритета (Priority) в TestNG и о том, как мы можем использовать его при выполнении автоматизированного тестирования Selenium.
Мы увидели, как TestNG обрабатывает любой отрицательный приоритет, или когда все методы имеют одинаковый приоритет, и когда все методы имеют разные приоритеты. Мы также столкнулись с ограничением TestNG, которое возникает, когда методы имеют одинаковый приоритет и выполняются параллельно.
Надеюсь, вам понравилось читать это руководство по Selenium TestNG о том, как установить приоритет тест-кейса в TestNG, и вы поняли, как установить приоритет тест-кейса в TestNG.
Удачного тестирования!
Материал подготовлен в рамках курса «Java QA Engineer. Professional».
Всех желающих приглашаем на бесплатный двухдневный интенсив «Сложная автоматизация тестирования. Что такое дженерики, слушатели (listeners), сложные ожидания?». На занятии мы поговорим про дженериĸи <T>, фунĸциональные интерфейсы и слушатели (listeners). Узнаем, что это таĸое, напишем свои слушатели, подсвечиваем элемент после нажатия, убираем подсветĸу, EventFiringDriver и праĸтиĸа.
→ РЕГИСТРАЦИЯ