Web Testing Automation на Java
Для чего нужны TestNG/JUnit?
TestNG и JUnit — это популярные фреймворки для
юнит-тестирования в Java, которые обеспечивают структуру и поддержку для
написания и запуска тестов. Вот основные цели их использования:
-
Структурирование тестов:
- Фреймворки предоставляют аннотации и методы для организации тестовых кодов, например,
@Test,@Before,@After,@BeforeClass, и@AfterClass.
- Фреймворки предоставляют аннотации и методы для организации тестовых кодов, например,
-
Управление тестовыми случаями:
- Позволяют легко определить, какие методы являются тестами, а также управлять их выполнением (например, игнорирование тестов с аннотацией
@Ignore).
- Позволяют легко определить, какие методы являются тестами, а также управлять их выполнением (например, игнорирование тестов с аннотацией
-
Поддержка параметризации и группировки тестов:
- Можно выполнять тесты с различными параметрами и группировать их для специфической отчетности или совместного запуска.
-
Поддержка зависимостей:
- Тесты могут быть настроены на выполнение в определенном порядке с учетом зависимостей друг от друга, что полезно для комплексных интеграционных тестов.
-
Ассерты и исключения:
- Оба фреймворка предлагают богатые возможности для проверки условий в тестах через ассерты (утверждения) и автоматическую обработку исключений.
-
Интеграция с другими инструментами:
- Легко интегрируются с инструментами сборки, такими как Maven и Gradle, а также с инструментами непрерывной интеграции и различными IDE.
-
Отчетность:
- Предоставляют подробные отчеты о ходе выполнения тестов и результатах, что упрощает отладку и обеспечение качества.
Оба фреймворка поддерживают параметризацию, расширение и интеграцию со сборкой. TestNG предоставляет группы и зависимости тестов; в JUnit Jupiter есть расширения, динамические и параметризованные тесты. Выбор зависит от проекта; приведённые ниже примеры явно различают JUnit 4 и Jupiter.
Какие инструкции используются в TestNG/JUnit?
TestNG и JUnit предоставляют различные аннотации и
инструкции для управления процессом тестирования. Вот основные инструкции,
используемые в этих фреймворках:
TestNG:
-
@Test:
- Определяет метод как тестовый случай.
-
@BeforeSuite/@AfterSuite:
- Методы, помеченные этими аннотациями, выполняются до или после всех тестов в тестовом наборе.
-
@BeforeTest/@AfterTest:
- Методы выполняются перед началом или после завершения всех тестов, объявленных в
<test>теге в файлеtestng.xml.
- Методы выполняются перед началом или после завершения всех тестов, объявленных в
-
@BeforeClass/@AfterClass:
- Методы выполняются один раз до начала всех тестов в текущем классе и после завершения всех тестов соответственно.
-
@BeforeMethod/@AfterMethod:
- Методы, которые выполняются перед и после каждого тестового метода.
-
@DataProvider:
- Метод, который возвращает данные для тестов, обычно используется для параметризации тестов.
-
@Parameters:
- Позволяет передавать параметры в тесты из файла
testng.xml.
- Позволяет передавать параметры в тесты из файла
-
@Listeners:
- Указывает слушателей событий, таких как логирование или отслеживание выполнения тестов.
JUnit:
-
@Test:
- Определяет метод как тестовый случай.
-
@BeforeClass/@AfterClass (JUnit 4) или @BeforeAll/@AfterAll (JUnit 5):
- Статические методы, которые выполняются один раз до начала и после завершения всех тестов в классе.
-
@Before/@After (JUnit 4) или @BeforeEach/@AfterEach (JUnit 5):
- Методы, которые выполняются перед и после каждого тестового метода.
-
@Ignore (JUnit 4) или @Disabled (JUnit 5):
- Исключает метод из тестового прогона.
-
@ParameterizedTest (JUnit 5):
- Определяет параметризованный тест, который запускается несколько раз с различными аргументами.
-
@TestFactory (JUnit 5):
- Динамическое определение тестов во время выполнения.
-
@Nested (JUnit 5):
- Позволяет определять классы внутри тестового класса для логической группировки тестов.
-
@Tag (JUnit 5):
- Для добавления меток к тестам, удобно использовать для фильтрации тестов при выполнении.
Оба фреймворка предоставляют богатый набор инструментов для управления тестовым процессом, позволяя разработчикам адаптировать тестирование к специфике проекта и улучшать процессы непрерывной интеграции.
Какие assertions есть в TestNG/JUnit?
Assertions в TestNG и JUnit представляют собой методы, которые
используются для проверки условий в тестах. Эти утверждения генерируют ошибку,
если условие не выполняется, что указывает на то, что тест не прошёл. Вот
некоторые из наиболее часто используемых утверждений в обоих фреймворках:
TestNG Assertions:
TestNG использует класс Assert, который предоставляет различные статические методы для проверки тестов:
-
assertEquals: Проверяет, что два значения равны.
Assert.assertEquals(actual, expected, "Optional failure message"); -
assertNotEquals: Проверяет, что два значения не равны.
Assert.assertNotEquals(actual, unexpected, "Optional failure message"); -
assertTrue: Проверяет, что условие истинно.
Assert.assertTrue(condition, "Failure message"); -
assertFalse: Проверяет, что условие ложно.
Assert.assertFalse(condition, "Failure message"); -
assertNull: Проверяет, что объект является
null.Assert.assertNull(object, "Failure message"); -
assertNotNull: Проверяет, что объект не является
null.Assert.assertNotNull(object, "Failure message"); -
assertSame: Проверяет, что два объекта указывают на один и тот же объект.
Assert.assertSame(actual, expected, "Failure message"); -
assertNotSame: Проверяет, что два объекта не указывают на один и тот же объект.
Assert.assertNotSame(actual, unexpected, "Failure message");
JUnit Assertions:
JUnit в своих последних версиях (особенно JUnit 5) использует класс Assertions, который предлагает похожие методы:
-
assertEquals: Проверяет равенство двух объектов.
Assertions.assertEquals(expected, actual, "Optional failure message"); -
assertNotEquals: Проверяет, что два объекта не равны.
Assertions.assertNotEquals(unexpected, actual, "Optional failure message"); -
assertTrue: Проверяет, что условие истинно.
Assertions.assertTrue(condition, "Failure message"); -
assertFalse: Проверяет, что условие ложно.
Assertions.assertFalse(condition, "Failure message"); -
assertNull: Проверяет, что объект является
null.Assertions.assertNull(object, "Failure message"); -
assertNotNull: Проверяет, что объект не является
null.Assertions.assertNotNull(object, "Failure message"); -
assertSame: Проверяет, что два объекта ссылаются на один и тот же объект.
Assertions.assertSame(expected, actual, "Failure message"); -
assertNotSame: Проверяет, что два объекта не ссылаются на один и тот же объект.
Assertions.assertNotSame(unexpected, actual, "Failure message");
Эти утверждения помогают контролировать ожидаемые результаты ваших тестов и являются ключевым инструментом для обеспечения точности и надежности вашей тестовой среды.
Как выполнять тесты параллельно TestNG/JUnit?
Параллельное выполнение тестов может значительно сократить время тестирования, особенно для больших наборов тестов или для тестов, требующих взаимодействия с веб-страницами. Вот как можно настроить параллельное выполнение тестов в TestNG и JUnit:
TestNG
TestNG предоставляет встроенную поддержку для параллельного выполнения тестов, что легко настраивается через аннотации или XML-конфигурацию.
-
XML-конфигурация:
- Вы можете настроить параллельное выполнение тестов в вашем
testng.xmlфайле, указав атрибутparallelиthread-countдля определения уровня параллелизма (тесты, классы, методы, экземпляры).
<suite name="MySuite" parallel="methods" thread-count="10"> <test name="Test1"> <classes> <class name="com.example.MyTestClass1"/> </classes> </test> <test name="Test2"> <classes> <class name="com.example.MyTestClass2"/> </classes> </test> </suite> - Вы можете настроить параллельное выполнение тестов в вашем
-
Аннотация:
- Также можно использовать аннотацию
@DataProviderс параметромparallel=true, чтобы выполнять методы, которые получают данные от этого провайдера, параллельно.
@DataProvider(name = "data", parallel = true) public Object[][] getData() { return new Object[][] { {"data1"}, {"data2"} }; } @Test(dataProvider = "data") public void test(String data) { System.out.println(data); } - Также можно использовать аннотацию
JUnit
Для JUnit параллельное выполнение тестов не поддерживается напрямую до JUnit 5. В JUnit 5 используется библиотека JUnit Platform, которая поддерживает параллельное выполнение тестов через настройки в файле junit-platform.properties.
-
JUnit 5 Configuration:
- Добавьте или измените файл
junit-platform.propertiesв ресурсах тестов для настройки параллельного выполнения.
junit.jupiter.execution.parallel.enabled = true junit.jupiter.execution.parallel.mode.default = concurrent- Можно также настроить, какие элементы должны выполняться параллельно (например, классы или методы).
junit.jupiter.execution.parallel.mode.classes.default = concurrent- Также можно настроить количество потоков:
junit.jupiter.execution.parallel.config.strategy = fixed junit.jupiter.execution.parallel.config.fixed.parallelism = 4 - Добавьте или измените файл
Использование этих настроек позволит вам оптимизировать время выполнения тестов, запуская их параллельно на разных уровнях, будь то методы, классы или даже отдельные тесты в рамках одного класса.