Анотація @Test є однією з основних анотацій у TestNG, завдяки їй класи та методи позначаються як тестові:
- анотація @Test застосована до методу, повідомляє TestNG, що цей метод є “тестовим”, і його слід виконувати під час запуску тестів
- анотація @Test застосована до класу, повідомляє TestNG, що всі public методи всередині цього класу є “тестовими”, і їх слід виконати під час запуску тестів
Для додаткових налаштувань тестів, анотація @Test підтримує ряд атрибутів, які можна використовувати з цією анотацією.
alwaysRun
Цей атрибут приймає значення true або false (за замовчуванням має значення false). Якщо встановлено true, тестовий метод завжди виконуватиметься, навіть якщо тест (або група тестів) від виконання котрих він залежить, завершиться невдало. Приклад:
public class AlwaysRunTest {
@Test
void testA() {
assertEquals("string A", "string B");
}
@Test(alwaysRun = true, dependsOnMethods = "testA")
void testB() {
assertEquals("string A", "string A");
}
}Результат:

Незважаючи на невдалий результат testA, залежний від нього testB, було виконано завдяки alwaysRun = true.
dataProvider та dataProviderClass
dataProvider – використовується для посилання на метод постачальник даних (DataProvider) для тесту, під час використання параметризації.
dataProviderClass використовується для посилення на клас, в якому міститься метод постачальник даних, коли потрібно використати DataProvider з іншого класу.
Докладніше про параметризацію в TestNG можна подивитись в нотатці:
TestNG DataProvider – простий приклад параметризації тестів
dependsOnGroups
dependsOnGroups використовується, щоб зробити виконання тесту залежним від статусу виконання певної групи тестів. Можна вказати одну групу або список груп, від яких залежить тестовий метод.
Усі тести з груп вказаних в dependsOnGroups виконуються перед тестовим методом. Якщо будь-який тест завершується невдало, залежний від dependsOnGroups тестовий метод буде позначено як Skip.
Приклад:
public class DependsOnGroupsTest {
@Test(groups = "smoke")
void testA() {
assertEquals("string A", "string A");
}
@Test(groups = "smoke")
void testB() {
assertNotEquals("string B", "string B");
}
@Test(dependsOnGroups = "smoke")
void testC() {
assertEquals("string C", "string C");
}
}Результат:

- testC залежить від групи тестів smoke, в яку входять testA та testB
- через невдалий результат виконання testB, залежний від групи testC було проігноровано, та помічено як Skip
dependsOnMethods
dependsOnMethods використовується, щоб зробити тестовий метод залежним від певного тесту (або списку тестів).
Тестовий метод запуститься після виконання всіх тестів, від яких він залежить. Якщо будь-який з тестів вказаних в dependsOnMethods завершиться невдало, тест не буде запущено та позначено як SKIP.
Приклад:
public class DependsOnMethodsTest {
@Test
void testA() {
assertEquals("string A", "string A");
}
@Test
void testB() {
assertNotEquals("string B", "string B");
}
@Test(dependsOnMethods = {"testA", "testB"})
void testC() {
assertEquals("string C", "string C");
}
}Результат:

- testC залежить від результатів виконання testA та testB
- через невдалий результат виконання testB, залежний від нього testA було проігноровано, та помічено як Skip
description
За допомогою description можна додати опис до тестового методу. Приклад:
public class DescriptionTest {
@Test(description = "simple test")
void testA() {
assertEquals("string A", "string A");
}
}enabled
enabled використовується для вимкнення виконання певного тесту, або набору тестів у TestNG. Досягається встановленням для атрибута enabled значення false.
Якщо застосувати цей атрибут для анотації @Test на рівні класу, усі публічні тестові методи оголошені всередині класу, будуть вимкнені.
Приклад:
public class EnabledTest {
@Test
void testA() {
assertEquals("string A", "string A");
}
@Test
void testB() {
assertNotEquals("string B", "string B");
}
@Test(enabled = false)
void testC() {
assertEquals("string C", "string C");
}
}Результат:

testC помічений як enabled = false під час запуску тестів було взагалі проігноровано.
expectedExceptions
expectedExceptions використовується для перевірки винятків. Атрибут визначає тип винятків, які очікується будуть створені тестовим методом під час виконання.
Якщо виняток, створений тестом, не збігається зі списком винятків заданим у expectExceptions, тест буде позначено як невдалий.
TestNG також підтримує кілька очікуваних винятків, для перевірки під час виконання певного тесту.
Приклад:
public class ExpectedExceptionsTest {
@Test(expectedExceptions = ArrayIndexOutOfBoundsException.class)
void testA() {
List<String> strings = List.of("A", "B", "C");
assertEquals(strings.get(3), "D");
}
}Результат:

В цьому прикладі очікується, що тестовим методом буде згенеровано виключення ArrayIndexOutOfBoundsException, що і відбувається під час виклику strings.get(3). В результаті тест має успішний статус виконання.
groups
groups вказує список груп, до яких належить тестовий метод або клас. Приклад:
public class GroupsTest {
@Test(groups = "smoke_tests")
void testA() {
assertEquals("string A", "string A");
}
@Test(groups = "smoke_tests")
void testB() {
assertEquals("string B", "string B");
}
@Test
void testC() {
assertEquals("string C", "string C");
}
}Це надає можливість виконувати лише окремі групи, під час запуску тестів (налаштування testng.xml файлу, командний рядок). Наприклад запуск групи за допомогою командного рядка та maven:
mvn test -Dgroups=smoke_testsРезультат:

testC не було виконано, так як він не входить до групи smoke_tests.
invocationCount
invocationCount використовується для виконання тестового методу задану кількість разів. Приклад:
public class InvocationCountTest {
@Test(invocationCount = 3)
void testA() {
assertEquals("string A", "string A");
}
}Результат:

invocationTimeOut
invocationTimeOut обмежує період сукупного часу (в мілісекундах), для виконання тестів (вказаної кількості разів в invocationCount). Цей атрибут ігноруватиметься, якщо invocationCount не вказано. Приклад:
public class InvocationTimeOutTest {
@Test(invocationCount = 4, invocationTimeOut = 600)
void testA() throws InterruptedException {
Thread.sleep(200);
assertEquals("string A", "string A");
}
}Результатом виконання цього тесту буде Fail, з описом причини:
org.testng.internal.thread.ThreadTimeoutException: Method wiki.it.notes.testng.annotation.test.InvocationTimeOutTest.testA() didn't finish within the time-out 600timeOut
timeOut визначає період часу (в мілісекундах) за який очікується завершення тесту.
Наприклад, під час виконання тестів можуть бути випадки, коли певні тести можуть зайняти набагато більше часу ніж очікувалося, через що потрібно позначити тест як невдалий:
public class TimeOutTest {
@Test(timeOut = 500)
void testA() throws InterruptedException {
Thread.sleep(600);
assertEquals("string A", "string A");
}
}Результат:
org.testng.internal.thread.ThreadTimeoutException: Method wiki.it.notes.testng.annotation.test.TimeOutTest.testA() didn't finish within the time-out 500priority
priority встановлює пріоритет виконання на рівні методу тестування. Він повідомляє TestNG, якої послідовності слід дотримуватися під час запуску тестових методів. Нижчі пріоритети будуть запущені раніше. Тобто тест з priority 0, буде виконано перед тестом з priority 1.
Приклад:
public class PriorityTest {
@Test(priority = 3)
void testA() {
assertEquals("string A", "string A");
}
@Test(priority = 2)
void testB() {
assertEquals("string B", "string B");
}
@Test(priority = 1)
void testC() {
assertEquals("string C", "string C");
}
}Результат:

singleThreaded
singleThreaded – якщо встановлено значення true, усі методи тестового класу гарантовано будуть працювати в одному потоці, навіть якщо тести запущено з налаштуванням parallel=”methods”.
Цей атрибут можна використовувати лише на рівні класу, і він ігноруватиметься при застосуванні на рівні методу.
Приклад:
@Test(singleThreaded = true)
public class SingleThreadedTest {
public void testA() {
assertEquals("string A", "string A");
}
public void testB() {
assertEquals("string B", "string B");
}
public void testC() {
assertEquals("string C", "string C");
}
}threadPoolSize
threadPoolSize розмір пулу потоків для тестового методу. Цей атрибут ігнорується, якщо invocationCount не вказано. Приклад:
public class ThreadPoolSizeTest {
@Test(invocationCount = 4, invocationTimeOut = 600, threadPoolSize = 4)
void testA() throws InterruptedException {
Thread.sleep(200);
assertEquals("string A", "string A");
}
}Результат:

Завдяки запуску testA в паралель з чотирьох потоків, було скорочено сумарний час виконання тесту, що дозволило вписатися у встановлений invocationTimeOut = 600
successPercentage
successPercentage встановлює очікуваний відсоток успішних результатів для тестового методу. Приклад:
public class SuccessPercentageTest {
int count = 0;
@Test(invocationCount = 5, successPercentage = 60)
void testA() {
count ++;
assertTrue(count < 4);
}
}Результат:

Незважаючи на те, що 2 з 5 результатів для testA мали статус Fail, відсоток успішних результатів вписався у 60 відсотків, через що тестовий набір отримав загальний статус Success.
Код прикладів з нотатки є на сторінці Github: