Аннотации TestNG
В первой статье мы уже рассмотрели некоторые аннотации в TestNG фреймворке: мы использовали только три (Before, After и Test). Они являются наиболее используемыми, но следует рассмотреть остальные.
Прежде всего давайте рассмотрим иерархию или уровни аннотаций в TestNG.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<suite> <test> <classes> <method> <test> </method> </classes> </test> </suite> |
Можно увидить, что @Test имеет самый нижний уровень . Метод с аннотацией @Method будет выполнен первым, перед и после выполнения @Test. Таким же образом метод с аннотацией @Class будет выполнен первым, до и после выполнения метода с @Method.
Пример ниже прояснит сказанное выше:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
package automationFramework; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterSuite; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeSuite; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class Sequencing { @Test public void testCase1() { System.out.println("This is the Test Case 1"); } @Test public void testCase2() { System.out.println("This is the Test Case 2"); } @BeforeMethod public void beforeMethod() { System.out.println("This will execute before every Method"); } @AfterMethod public void afterMethod() { System.out.println("This will execute after every Method"); } @BeforeClass public void beforeClass() { System.out.println("This will execute before Class"); } @AfterClass public void afterClass() { System.out.println("This will execute after the Class"); } @BeforeTest public void beforeTest() { System.out.println("This will execute before the Test"); } @AfterTest public void afterTest() { System.out.println("This will execute after the Test"); } @BeforeSuite public void beforeSuite() { System.out.println("This will execute before the Test Suite"); } @AfterSuite public void afterSuite() { System.out.println("This will execute after Test Suite"); } } |
Ниже показан результат выполнения:
Метод с аннотацией @BeforeSuite/@AfterSuite выполняются в самом начале и конце. Потом методы с @BeforeTest и @AfterTest, @BeforeClass и @AfterClass. Можно заметить, что @BeforeMethod и @AfterMethod выполняются дважды: перед и после каждого метода с аннотацией @Test.
Группировка тест-кейсов
“Groups” – это еще один вид аннотаций TestNG, который позволяет обьединять тест-кейсы в группы или сьюты (test suites).
Как это сделать…
1) Давайте создадим по два метода Car, Scooter и обьединение Car и Sedan Car.
2) Сгруппируйте их отдельно, используя аннотацию (groups = { “Название группы” })
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
package automationFramework; import org.testng.annotations.Test; public class Grouping { @Test (groups = { "Scooter" }) public void Scooter1() { System.out.println("Batch Scooter - Test scooter 1"); } @Test (groups = { "Scooter" }) public void Scooter2() { System.out.println("Batch Scooter - Test scooter 2"); } @Test (groups = { "Car" }) public void Car1() { System.out.println("Batch Car - Test car 1"); } @Test (groups = { "Car" }) public void Car2() { System.out.println("Batch Car - Test car 2"); } @Test (groups = { "Car", "Sedan Car" }) public void Sedan1() { System.out.println("Batch Sedan Car - Test sedan 1"); } } |
3) Создайте TestNG xml вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<suite name="Suite"> <test name="Practice Grouping"> <groups> <run> <include name="Car" /> </run> </groups> <classes> <class name="automationFramework.Grouping" /> </classes> </test> </suite> |
4) Запустите testng.xml файл: Run As > TestNG Suite. Результат выполнения можно увидить в консоли:
Обратите внимание, что мы вызвали только группу “Car” в xml и он тоже выполнил тесты для Sedan Car, так как мы упомянули “Car” с группой “Sedan Car”: @Test (groups = { “Car”, “Sedan Car” }
Группировка групп также возможна:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<suite name="Suite"> <test name="Practice Grouping"> <groups> <define name="All"> <include name="Car"/> <include name="Scooter"/> </define> <run> <include name="All"/> </run> </groups> <classes> <class name="automationFramework.Grouping" /> </classes> </test> </suite> |
Можно увидить, что мы создали группу “All” и включили в нее другие группы:
Зависимости тестов
Часто приходится вызывать методы в определенном порядке или вносить определенные изменения между запусками тестов. Это делается с помощью явных зависимостей между тестовыми методами.
TestNG позволяет создавать зависимости с помощью:
- Использования атрибута dependsOnMethods в аннотации @Test
- Использования dependsOnGroups в @Test аннотации.
Просмотрите следующий пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package automationFramework; import org.testng.annotations.Test; public class Dependent { @Test (dependsOnMethods = { "OpenBrowser" }) public void SignIn() { System.out.println("This will be executed second (SignIn)"); } @Test public void OpenBrowser() { System.out.println("This will be executed first (Open Browser)"); } @Test (dependsOnMethods = { "SignIn" }) public void LogOut() { System.out.println("This will be executed third (Log Out)"); } |
Результат будет следующим: