Как установить приоритет тест-кейса в TestNG с помощью Selenium

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

TestNG — это мощная система автоматизации тестирования с открытым исходным кодом и широким набором функций, включая аннотации, провайдеры данных, групповое тестирование, определение приоритетов и многое другое.

Приоритизация в TestNG — это простой способ установить приоритет тест-кейсов и запускать их в нужном порядке. Эта функция особенно полезна при определении последовательности выполнения тест-кейсов, когда у вас несколько тест-кейсов или вы назначаете приоритет нескольким методам по сравнению с другими. Например, если вы хотите, чтобы сначала выполнялся сценарий входа в систему, а затем добавление товара в корзину, вам не нужно беспокоиться, поскольку TestNG все для этого предусмотрел.

В предыдущих блогах этой серии уроков по Selenium TestNG мы узнали, как установить TestNG, как использовать аннотации в TestNG и многое другое. В этом блоге мы рассмотрим, как установить приоритет тест-кейса в TestNG при выполнении автоматизированного тестирования Selenium.

Давайте начнем!

СОДЕРЖАНИЕ

  1. Что такое приоритет теста в TestNG?

  2. Синтаксис для использования приоритета теста в TestNG

  3. Как установить приоритет тест-кейса в TestNG с помощью Selenium?

  4. Проблема 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]

Просмотр кода:

  1. Импортированные зависимости: Здесь мы импортировали все необходимые классы, включая 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 и праĸтиĸа.
>> РЕГИСТРАЦИЯ

Источник: https://habr.com/ru/company/otus/blog/588466/


Интересные статьи

Интересные статьи

В этом руководстве я объясню необходимые шаги для интеграции веб-компонентов в Angular.
Представьте, что у вас нет под рукой калькулятора (но есть циркуль, линейка или угольник) и вам нужно посчитать результат в виде отрезка. Не более 5 простых шагов и резул...
Источник Существует множество мест, где потребность в звукоизоляции особенно высока: офис, музыкальная студия, коворкинг, домашний кабинет. Последний вариант особенно актуален в условиях...
Background Cleaner API — полностью бесплатный API для удаления фона с изображений с помощью нейросети. Его можно назвать бесплатным аналогом известного remove.bg.Данный API, в отличи...
Существует традиция, долго и дорого разрабатывать интернет-магазин. :-) Лакировать все детали, придумывать, внедрять и полировать «фишечки» и делать это все до открытия магазина.