Мир, труд, май, хабровчане! Для тех, кто также как и мы ворвался в межпраздничную рабочую неделю, мы подготовили перевод, который хотим приурочить к старту набора на курс «Java QA Engineer», запуск которого запланирован на 28 мая.

TestNG — это тестовый фреймворк, созданный Cédric Beust, он помогает нам удовлетворить многие наши потребности в тестировании. TestNG широко используется вместе с Selenium. Хотите знать, что означает NG? Это значит “Next Generation” (“Следующее поколение”). TestNG похож на JUnit, но он более мощный, когда дело касается управления потоком выполнения вашей программы. Архитектура фреймворка помогает нам сделать тесты более структурированными и обеспечить лучшие точки валидации.
Некоторые особенности TestNG, заслуживающие внимания:
Обычно процесс тестирования с использованием TestNG включает в себя следующие этапы:

Перед тем как перейти к аннотациям TestNG для Selenium, обозначим предварительные требования для настройки TestNG.
Предварительные условия:
Примечание: Java-аннотации могут быть использованы только с Java версии 1.5 и выше.
Если вы новичок с TestNG, то посмотрите статью о том, как запустить первый скрипт автоматизации с TestNG.
Итак, что такое аннотация?
Это самая важная аннотация в TestNG, в которой находится основная логика теста. Все автоматизируемые функции находятся в методе с аннотацией
Пример кода ниже, проверяет переход по url:
Метод с этой аннотацией запускается перед запуском первого метода с аннотацией
Ниже приведён пример для BeforeTest, в котором браузер разворачивается на весь экран:
Методы, помеченные этой аннотацией, запускаются после всех
Пример кода:
Методы с этой аннотацией запускаются перед каждым
Ниже приведён фрагмент кода, демонстрирующий вход в LambdaTest:
Методы с этой аннотацией запускаются после каждого
Ниже приведён фрагмент кода, демонстрирующий получение скриншота:
Метод с этой аннотацией выполнится перед первым тестовым методом в текущем классе. Эту аннотацию можно использовать для настройки свойств браузера, инициализации драйвера, открытия браузера с нужным URL-адресом и т.д.
Пример кода для BeforeClass:
Метод с этой аннотацией выполнится после последнего тестового метода в текущем классе. Эта аннотация в TestNG может использоваться для выполнения действий по очистке ресурсов после выполнения теста, таких как закрытие драйвера и т.п.
Ниже приведён пример фрагмента кода, показывающего закрытие драйвера:
Набор тестов (suite) может состоять из нескольких классов, эта аннотация запускается перед всеми тестовыми методами всех классов. Эта аннотация помечает точку входа при запуске. Аннотацию
Пример аннотации
Эта аннотация в TestNG запускается после запуска всех методов тестирования во всех классах. Эта аннотация может использоваться для очистки перед завершением тестов, когда у вас используется несколько классов, например, закрытие драйверов и т. д.
Ниже приведён фрагмент кода для аннотации
TestNG может объединять тесты в группы с помощью атрибута group в аннотации
Пример использования
Эта аннотация запускается после выполнения всех тестовых методов указанной группы.
Пример кода для аннотации
Пример
В приведённом ниже коде показаны примеры использования всех аннотаций, рассмотренных выше:
Отчёт TestNG Report:

Вывод в консоли:

Аннотации, описанные выше, выполняются в рантайме в следующем порядке:
Вот порядок их выполнения:

Атрибуты, используемые с аннотациями в TestNG
У аннотаций в TestNG есть атрибуты, которые можно использовать для настройки. Они помогают настроить порядок выполнения тестовых методов.
Вот эти атрибуты:
Выше описаны атрибуты, используемые с аннотациями в TestNG c Selenium. Ниже приведён фрагмент кода, демонстрирующий использование вышеуказанных атрибутов:
Вывод в консоль:

Отчёт TestNG:

Дополнительные аннотации в TestNG
Есть еще несколько полезных аннотаций, которые помогут нам достигнуть желаемых целей.
Метод с этой аннотацией используется для предоставления данных тестовому методу, в котором задан атрибут dataProvider. Этот метод помогает в создании тестов, управляемых данными, в которые может передаваться несколько наборов входных значений. Метод должен возвращать двумерный массив или объект.
У аннотации
Пример ниже показывает использование аннотации
Эта аннотация помогает запускать несколько тестовых классов через один тестовый класс. Проще говоря, она определяет и создаёт тесты динамически.
Приведённый ниже фрагмент кода показывает использование аннотации
Вывод консоли:

Эта аннотация позволяет вам передавать параметры в ваши тесты через файл TestNG.xml. Это удобно, когда нужно передать ограниченное количество данных в ваши тесты. В случае сложных и больших наборов данных лучше использовать аннотацию
Пример использования:
В файле TestNG.xml параметры определяются следующим образом:
Эта аннотация помогает при логировании и подготовке отчётов. Есть несколько “слушателей” (Listener):
Но описание этих слушателей и их использование оставим для другой статьи.
Вот и всё!
Ключевой момент, который следует учитывать при работе со всеми этими аннотациями и атрибутами, заключается в том, что нужно использовать Java версии 1.5 или выше, поскольку аннотации не поддерживаются в более ранних версиях java.
Все вышеупомянутые аннотации и атрибуты TestNG помогают улучшить структуру и читаемость кода. Это помогает предоставлять подробные отчёты, что делает отчёты о состоянии проще и полезнее. Использование этих аннотаций в TestNG для Selenium полностью зависит от ваших бизнес-требований. Следовательно, выбор правильных аннотаций и их правильное использование имеет важное значение. Вы можете попробовать эти аннотации в TestNG на LambdaTest Selenium Grid прямо сейчас!
Тех, кто дочитал до конца приглашаем на бесплатный открытый вебинар, который уже 14 мая проедет наш преподаватель — Дмитрий Еремин. Ну и по устоявшейся традиции ждём ваши комментарии, друзья.

TestNG — это тестовый фреймворк, созданный Cédric Beust, он помогает нам удовлетворить многие наши потребности в тестировании. TestNG широко используется вместе с Selenium. Хотите знать, что означает NG? Это значит “Next Generation” (“Следующее поколение”). TestNG похож на JUnit, но он более мощный, когда дело касается управления потоком выполнения вашей программы. Архитектура фреймворка помогает нам сделать тесты более структурированными и обеспечить лучшие точки валидации.
Некоторые особенности TestNG, заслуживающие внимания:
- Мощные и разнообразные аннотации для поддержки ваших тест-кейсов.
- Параллельное выполнение тестов, использование зависимостей между тестами.
- Гибкость выполнения ваших тестов на разных наборах данных, через файл TestNG.xml или через концепцию поставщиков данных (data-provider).
- Группировка и приоритизация тест-кейсов.
- Генерация HTML-отчётов, настройка с помощью различных плагинов.
- Генерация логов выполнения тестов.
- Лёгкая интеграция с Eclipse, Maven, Jenkins и др.
Обычно процесс тестирования с использованием TestNG включает в себя следующие этапы:

Перед тем как перейти к аннотациям TestNG для Selenium, обозначим предварительные требования для настройки TestNG.
Предварительные условия:
- Java Development Kit
- Eclipse или любая другая IDE
- Установленный TestNG в Eclipse или в вашу IDE
Примечание: Java-аннотации могут быть использованы только с Java версии 1.5 и выше.
Если вы новичок с TestNG, то посмотрите статью о том, как запустить первый скрипт автоматизации с TestNG.
Итак, что такое аннотация?
Аннотация — это метка, которая предоставляет дополнительную информацию о классе или методе (Примечание переводчика: в java аннотации могут применяться не только для классов и методов, но также и для других элементов). Для аннотаций используется префикс «@». TestNG использует аннотации, чтобы помочь в создании надёжной структуры тестов. Давайте посмотрим на аннотации TestNG, используемые для автоматизации тестирования с Selenium.
@Test
Это самая важная аннотация в TestNG, в которой находится основная логика теста. Все автоматизируемые функции находятся в методе с аннотацией
@Test
. Она имеет различные атрибуты, с помощью которых может быть настроен запуск метода.Пример кода ниже, проверяет переход по url:
@Test
public void testCurrentUrl() throws InterruptedException {
driver.findElement(By.xpath("//*[@id='app']/header/aside/ul/li[4]/a"))
.click();
String currentUrl = driver.getCurrentUrl();
assertEquals(
currentUrl,
"https://automation.lambdatest.com/timeline/?viewType=build&page=1",
"url did not matched");
}
@BeforeTest
Метод с этой аннотацией запускается перед запуском первого метода с аннотацией
@Test
. (Примечание переводчика: в рамках теста, определенного в разделе test
в xml-файле конфигурации). Вы можете использовать эту аннотацию в TestNG с Selenium для настройки браузера. Например, запустить браузер и развернуть его на весь экран, установить специфичные настройки браузера и т.д.Ниже приведён пример для BeforeTest, в котором браузер разворачивается на весь экран:
@BeforeTest
public void profileSetup() {
driver.manage().window().maximize();
}
@AfterTest
Методы, помеченные этой аннотацией, запускаются после всех
@Test
-методов вашего теста. (Примечание переводчика: в рамках теста, определенного в разделе test
в xml-файле конфигурации, в оригинале не совсем корректно написано “текущего класса”). Это полезная аннотация, которая пригодится для предоставления результатов выполнения тестов. Вы можете использовать эту аннотацию, чтобы создать отчёт о ваших тестах и отправить его заинтересованным сторонам по электронной почте.Пример кода:
@AfterTest
public void reportReady() {
System.out.println("Report is ready to be shared, with screenshots of tests");
}
@BeforeMethod
Методы с этой аннотацией запускаются перед каждым
@Test
-методом. Вы можете использовать её, чтобы перед выполнением теста проверить соединение с базой данных. Или, например, при тестировании функциональности, зависимой от логина пользователя, поместить сюда код для входа в систему.Ниже приведён фрагмент кода, демонстрирующий вход в LambdaTest:
@BeforeMethod
public void checkLogin() {
driver.get("https://accounts.lambdatest.com/login");
driver.findElement(By.xpath("//input[@name='email']")).sendKeys("sadhvisingh24@gmail.com");
driver.findElement(By.xpath("//input[@name='password']")).sendKeys("activa9049");
driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click();
}
@AfterMethod
Методы с этой аннотацией запускаются после каждого
@Test
-метода. Эту аннотацию можно использовать для создания скриншотов при каждом выполнении теста.Ниже приведён фрагмент кода, демонстрирующий получение скриншота:
@AfterMethod
public void screenShot() throws IOException {
TakesScreenshot scr = ((TakesScreenshot) driver);
File file1 = scr.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file1, new File("С:\\test-output\\test1.PNG"));
}
@BeforeClass
Метод с этой аннотацией выполнится перед первым тестовым методом в текущем классе. Эту аннотацию можно использовать для настройки свойств браузера, инициализации драйвера, открытия браузера с нужным URL-адресом и т.д.
Пример кода для BeforeClass:
@BeforeClass
public void appSetup() {
driver.get(url);
}
@AfterClass
Метод с этой аннотацией выполнится после последнего тестового метода в текущем классе. Эта аннотация в TestNG может использоваться для выполнения действий по очистке ресурсов после выполнения теста, таких как закрытие драйвера и т.п.
Ниже приведён пример фрагмента кода, показывающего закрытие драйвера:
@AfterClass
public void closeUp() {
driver.close();
}
@BeforeSuite
Набор тестов (suite) может состоять из нескольких классов, эта аннотация запускается перед всеми тестовыми методами всех классов. Эта аннотация помечает точку входа при запуске. Аннотацию
@BeforeSuite
в TestNG можно использовать для выполнения общих функций, таких как настройка и запуск Selenium или удалённых веб-драйверов и т.д.Пример аннотации
@BeforeSuite
в TestNG, демонстрирующий настройку драйвера:@BeforeSuite
public void setUp() {
System.setProperty(
"webdriver.chrome.driver",
"С:\\selenium\\chromedriver.exe");
driver = new ChromeDriver();
}
@AfterSuite
Эта аннотация в TestNG запускается после запуска всех методов тестирования во всех классах. Эта аннотация может использоваться для очистки перед завершением тестов, когда у вас используется несколько классов, например, закрытие драйверов и т. д.
Ниже приведён фрагмент кода для аннотации
@AfterSuite
в TestNG для Selenium:@AfterSuite
public void cleanUp() {
System.out.println("All close up activities completed");
}
@BeforeGroups
TestNG может объединять тесты в группы с помощью атрибута group в аннотации
@Test
. Например, если вы хотите, чтобы все схожие функции, связанные с управлением пользователями, были объединены вместе, вы можете пометить тесты, такие как dashboard (панель пользователя), profile (профиль), transactions (транзакции) и тому подобное, в одну группу, такую как “user_management”. Аннотация @BeforeGroups
в TestNG помогает запустить определённые действия перед указанной группой тестов. Эту аннотацию можно использовать, если группа фокусируется на одной функциональности, как указано в приведённом выше примере. Аннотация @BeforeGroup
может содержать функцию входа в систему, которая требуется для запуска тестов в группе, например, тестирование панели пользователя, профиля пользователя и т.д.Пример использования
@BeforeGroups
:@BeforeGroups("urlValidation")
public void setUpSecurity() {
System.out.println("url validation test starting");
}
@AfterGroups
Эта аннотация запускается после выполнения всех тестовых методов указанной группы.
Пример кода для аннотации
@AfterGroups
в TestNG для Selenium:@AfterGroups("urlValidation")
public void tearDownSecurity() {
System.out.println("url validation test finished");
}
Пример
В приведённом ниже коде показаны примеры использования всех аннотаций, рассмотренных выше:
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.*;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import static org.testng.Assert.assertEquals;
public class AnnotationsTestNG {
private WebDriver driver;
private String url = "https://www.lambdatest.com/";
@BeforeSuite
public void setUp() {
System.setProperty(
"webdriver.chrome.driver",
"С:\\selenium\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
System.out.println("The setup process is completed");
}
@BeforeTest
public void profileSetup() {
driver.manage().window().maximize();
System.out.println("The profile setup process is completed");
}
@BeforeClass
public void appSetup() {
driver.get(url);
System.out.println("The app setup process is completed");
}
@BeforeMethod
public void checkLogin() {
driver.get("https://accounts.lambdatest.com/login");
driver.findElement(By.xpath("//input[@name='email']")).sendKeys("sadhvisingh24@gmail.com");
driver.findElement(By.xpath("//input[@name='password']")).sendKeys("activa9049");
driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click();
System.out.println("The login process on lamdatest is completed");
}
@Test(groups = "urlValidation")
public void testCurrentUrl() throws InterruptedException {
driver.findElement(By.xpath("//*[@id='app']/header/aside/ul/li[4]/a")).click();
Thread.sleep(6000);
String currentUrl = driver.getCurrentUrl();
assertEquals(currentUrl, "https://automation.lambdatest.com/timeline/?viewType=build&page=1", "url did not matched");
System.out.println("The url validation test is completed");
}
@AfterMethod
public void screenShot() throws IOException {
TakesScreenshot scr = ((TakesScreenshot) driver);
File file1 = scr.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file1, new File("С:\\test-output\\test1.PNG"));
System.out.println("Screenshot of the test is taken");
}
@AfterClass
public void closeUp() {
driver.close();
System.out.println("The close_up process is completed");
}
@AfterTest
public void reportReady() {
System.out.println("Report is ready to be shared, with screenshots of tests");
}
@AfterSuite
public void cleanUp() {
System.out.println("All close up activities completed");
}
@BeforeGroups("urlValidation")
public void setUpSecurity() {
System.out.println("url validation test starting");
}
@AfterGroups("urlValidation")
public void tearDownSecurity() {
System.out.println("url validation test finished");
}
}
Отчёт TestNG Report:

Вывод в консоли:

Примечание переводчика:Последовательность выполнения аннотаций в TestNG для Selenium
- для запуска теста измените в методе setUp() путь к chromedriver.exe, а в методе screenShot() путь к папке со скриншотом. Также для успешного выполнения теста в методе checkLogin() должны быть валидные логин и пароль.
- Используемые maven-зависимости:
<dependencies> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>3.141.59</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> <scope>test</scope> </dependency> </dependencies>
Аннотации, описанные выше, выполняются в рантайме в следующем порядке:
- BeforeSuite
- BeforeTest
- BeforeClass
- BeforeGroups
- BeforeMethod
- Test
- AfterMethod
- AfterGroups
- AfterClass
- AfterTest
- AfterSuite
Вот порядок их выполнения:

Атрибуты, используемые с аннотациями в TestNG
У аннотаций в TestNG есть атрибуты, которые можно использовать для настройки. Они помогают настроить порядок выполнения тестовых методов.
Вот эти атрибуты:
- description: можно указать описание тестового метода.
Например,@Test
(description=”этот тест проверяет вход в систему”). - alwaysRun: этот атрибут гарантирует, что тестовый метод будет выполнен всегда, даже в случае падения тестов, от которых он зависит. Когда значение атрибута true, этот метод будет запускаться всегда.
Например,@Test
(alwaysRun= true). - dataProvider: задаёт имя поставщика данных (data provider) для тестового метода. Предположим, что вы собираетесь запускать свои тесты в нескольких браузерах, тогда в тестовом методе с атрибутом dataProvider, можно добавить параметры для браузера и его версии, которые будут передаваться в метод поставщиком данных. В этом случае тест, содержащий этот атрибут, будет использовать эти входные данные для запуска тестов в нескольких браузерах.
Например,@Test
(dataProvider=”cross-browser-testing”). - dependsOnMethods: предоставляет информацию о порядке выполнения тестов. Тест с этим атрибутом будет выполнен, только если успешно выполниться тест, от которого он зависит. Если тест, от которого зависит метод, падает, то тест не запускается.
Например,@Test
(depenOnmethod = “login”). - groups: помогает сгруппировать ваши тестовые методы, ориентированные на одну функциональность, в одну группу.
Например,@Test
(groups=”Payment_Module”).
Этот атрибут также позволяет управлять тем, какие тесты запускать. При запуске тестов можно игнорировать какие-то группы или, наоборот, запустить только некоторые группы. Всё, что нужно сделать, это указать нужные группы в файле TestNG.xml. В тегеinclude
указать группы, которые необходимо запустить, а в тегеexclude
, которые надо игнорировать. - dependsOnGroups: выполняет функции двух, вышеупомянутых атрибутов, то есть определяет зависимость тестового метода от указанной группы. Этот тестовый метод будет запущен только после того, как указанная группа тестов будет выполнена.
Например,@Test
(depenOnMethods = «Payment_Module»). - priority: помогает нам определить приоритет тестовых методов. Когда TestNG выполняет тестовые методы, он может делать это в произвольном порядке. В сценарии, где вы хотите, чтобы ваши тесты выполнялись в нужном порядке, вы можете использовать атрибут priority. Приоритет по умолчанию для всех тестовых методов равен 0. Сначала выполняются тесты с меньшим значением priority.
Например,@Test
(priority = 1),@Test
(priority = 2). В этом случае сначала будет выполнен тест с приоритетом, равным единице, а потом тест с приоритетом два. - enabled: этот атрибут используется, когда вам нужно игнорировать и не запускать определённый тест. Всё, что вам нужно сделать, это установить его в false.
Например,@Test
(enabled= false). - timeout: определяет время, за которое должен выполниться тест. Если выполнение теста превышает время, определённое атрибутом, то тест завершится с ошибкой с выбросом исключения org.testng.internal.thread.ThreadTimeoutException
Например,@Test
(timeOut= 500). Обратите внимание, что время указывается в миллисекундах. - invocationCount: работает точно так же, как цикл. Тест будет запущен столько раз, сколько указано в invocationCount.
Например,@Test
(invocationCount = 5), будет запущен 5 раз. - invocationTimeOut: используется вместе с вышеуказанным атрибутом invocationCount. Значение этого атрибута вместе с invocationCount указывает на то, что тест будет запущен столько раз, сколько указано в invocationCount, и в течение времени, указанного в атрибуте invocationTimeOut.
Например,@Test
(invocationCount = 5, invocationTimeOut = 20). - expectedExceptions: помогает обрабатывать исключения, выброс которых ожидается в тестовом методе. Если исключение, указанное в атрибуте, выброшено тестовым методом, то тест прошёл успешно. В противном случае, отсутствие исключения или выброс другого исключения, не указанного в атрибуте, провалит тест.
Например,@Test
(expectedExceptions = {ArithmeticException.class }).
Выше описаны атрибуты, используемые с аннотациями в TestNG c Selenium. Ниже приведён фрагмент кода, демонстрирующий использование вышеуказанных атрибутов:
import static org.testng.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class AnnotationsTest {
private WebDriver driver;
private String url = "https://www.lambdatest.com/";
@BeforeSuite
public void setUp() {
System.setProperty(
"webdriver.chrome.driver",
"С:\\selenium\\chromedriver.exe");
driver = new ChromeDriver();
System.out.println("The setup process is completed");
}
@BeforeTest
public void profileSetup() {
driver.manage().window().maximize();
System.out.println("The profile setup process is completed");
}
@BeforeClass
public void appSetup() {
driver.get(url);
System.out.println("The app setup process is completed");
}
@Test(priority = 2)
public void checkLogin() {
driver.get("https://accounts.lambdatest.com/login");
driver.findElement(By.xpath("//input[@name='email']")).sendKeys("sadhvisingh24@gmail.com");
driver.findElement(By.xpath("//input[@name='password']")).sendKeys("xxxxx");
driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click();
System.out.println("The login process on lamdatest is completed");
}
@Test(priority = 0, description = "this test validates the sign-up test")
public void signUp() throws InterruptedException {
WebElement link = driver.findElement(By.xpath("//a[text()='Free Sign Up']"));
link.click();
WebElement organization = driver.findElement(By.xpath("//input[@name='organization_name']"));
organization.sendKeys("LambdaTest");
WebElement firstName = driver.findElement(By.xpath("//input[@name='name']"));
firstName.sendKeys("Test");
WebElement email = driver.findElement(By.xpath("//input[@name='email']"));
email.sendKeys("User622@gmail.com");
WebElement password = driver.findElement(By.xpath("//input[@name='password']"));
password.sendKeys("TestUser123");
WebElement phoneNumber = driver.findElement(By.xpath("//input[@name='phone']"));
phoneNumber.sendKeys("9412262090");
WebElement termsOfService = driver.findElement(By.xpath("//input[@name='terms_of_service']"));
termsOfService.click();
WebElement button = driver.findElement(By.xpath("//button[text()='Signup']"));
button.click();
}
@Test(priority = 3,
alwaysRun = true,
dependsOnMethods = "check_login",
description = "this test validates the URL post logging in",
groups = "url_validation")
public void testCurrentUrl() throws InterruptedException {
driver.findElement(By.xpath("//*[@id='app']/header/aside/ul/li[4]/a")).click();
String currentUrl = driver.getCurrentUrl();
assertEquals(
currentUrl,
"https://automation.lambdatest.com/timeline/?viewType=build&page=1",
"url did not matched");
System.out.println("The url validation test is completed");
}
@Test(priority = 1,
description = "this test validates the logout functionality",
timeOut = 25000)
public void logout() throws InterruptedException {
Thread.sleep(6500);
driver.findElement(By.xpath("//*[@id='userName']")).click();
driver.findElement(By.xpath("//*[@id='navbarSupportedContent']/ul[2]/li/div/a[5]")).click();
}
@Test(enabled = false)
public void skipMethod() {
System.out.println("this method will be skipped from the test run using the attribute enabled=false");
}
@Test(priority = 6, invocationCount = 5, invocationTimeOut = 20)
public void invocationcountShowCaseMethod() {
System.out.println("this method will be executed by 5 times");
}
@AfterMethod()
public void screenshot() throws IOException {
TakesScreenshot scr = ((TakesScreenshot) driver);
File file1 = scr.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file1, new File("С:\\test-output\\test1.PNG"));
System.out.println("Screenshot of the test is taken");
}
@AfterClass
public void closeUp() {
driver.close();
System.out.println("The close_up process is completed");
}
@AfterTest
public void reportReady() {
System.out.println("Report is ready to be shared, with screenshots of tests");
}
@AfterSuite
public void cleanUp() {
System.out.println("All close up activities completed");
}
@BeforeGroups("urlValidation")
public void setUpSecurity() {
System.out.println("url validation test starting");
}
@AfterGroups("urlValidation")
public void tearDownSecurity() {
System.out.println("url validation test finished");
}
}
Вывод в консоль:

Отчёт TestNG:

Дополнительные аннотации в TestNG
Есть еще несколько полезных аннотаций, которые помогут нам достигнуть желаемых целей.
@DataProvider
Метод с этой аннотацией используется для предоставления данных тестовому методу, в котором задан атрибут dataProvider. Этот метод помогает в создании тестов, управляемых данными, в которые может передаваться несколько наборов входных значений. Метод должен возвращать двумерный массив или объект.
У аннотации
@DataProvider
есть два атрибута:- name — этот атрибут используется для указания имени поставщика данных. Если не указано, то по умолчанию используется название метода.
- parallel — этот атрибут позволяет запускать тесты параллельно с разными данными. Наличие этого атрибута является одним из преимуществ TestNG перед Junit. По умолчанию false.
Пример ниже показывает использование аннотации
@DataProvider
с заданными атрибутами name и parallel.@DataProvider(name = "SetEnvironment", parallel = true)
public Object[][] getData() {
Object[][] browserProperty = new Object[][]{
{Platform.WIN8, "chrome", "70.0"},
{Platform.WIN8, "chrome", "71.0"}
};
return browserProperty;
}
@Factory
Эта аннотация помогает запускать несколько тестовых классов через один тестовый класс. Проще говоря, она определяет и создаёт тесты динамически.
Приведённый ниже фрагмент кода показывает использование аннотации
@Factory
, которая помогает вызывать методы тестового класса.import org.testng.annotations.Test;
import org.testng.annotations.Factory;
class FactorySimplyTest1 {
@Test
public void testMethod1() {
System.out.println("This is to test for method 1 for Factor Annotation");
}
}
class FactorySimpleTest2 {
@Test
public void testMethod2() {
System.out.println("This is to test for method 2 for Factor Annotation");
}
}
public class FactoryAnnotation {
@Factory()
@Test
public Object[] getTestFactoryMethod() {
Object[] factoryTest = new Object[2];
factoryTest[0] = new FactorySimplyTest1();
factoryTest[1] = new FactorySimpleTest2();
return factoryTest;
}
}
Вывод консоли:

@Parameters
Эта аннотация позволяет вам передавать параметры в ваши тесты через файл TestNG.xml. Это удобно, когда нужно передать ограниченное количество данных в ваши тесты. В случае сложных и больших наборов данных лучше использовать аннотацию
@DataProvider
или Excel.Пример использования:
@Parameters({"username", "password"})
@Test()
public void checkLogin(String username, String password) {
driver.get("https://accounts.lambdatest.com/login");
driver.findElement(By.xpath("//input[@name='email']")).sendKeys(username);
driver.findElement(By.xpath("//input[@name='password']")).sendKeys(password);
driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/button")).click();
System.out.println("The login process on lamdatest is completed");
}
В файле TestNG.xml параметры определяются следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<test thread-count="5" name="Annotations">
<parameter name="username" value="sadhvisingh24@gmail.com" />
<parameter name="password" value="XXXXX" />
<classes>
<class name="Parameter_annotation"/>
</classes>
</test> <!-- Annotations -->
</suite> <!-- Suite -->
@Listener
Эта аннотация помогает при логировании и подготовке отчётов. Есть несколько “слушателей” (Listener):
- IExecutionListener
- IAnnotationTransformer
- ISuiteListener
- ITestListener
Но описание этих слушателей и их использование оставим для другой статьи.
Вот и всё!
Ключевой момент, который следует учитывать при работе со всеми этими аннотациями и атрибутами, заключается в том, что нужно использовать Java версии 1.5 или выше, поскольку аннотации не поддерживаются в более ранних версиях java.
Все вышеупомянутые аннотации и атрибуты TestNG помогают улучшить структуру и читаемость кода. Это помогает предоставлять подробные отчёты, что делает отчёты о состоянии проще и полезнее. Использование этих аннотаций в TestNG для Selenium полностью зависит от ваших бизнес-требований. Следовательно, выбор правильных аннотаций и их правильное использование имеет важное значение. Вы можете попробовать эти аннотации в TestNG на LambdaTest Selenium Grid прямо сейчас!
Тех, кто дочитал до конца приглашаем на бесплатный открытый вебинар, который уже 14 мая проедет наш преподаватель — Дмитрий Еремин. Ну и по устоявшейся традиции ждём ваши комментарии, друзья.