Ответ
Выбор фреймворка зависит от типа тестов. Основные инструменты в экосистеме Java:
Юнит-тестирование:
- JUnit 5 — стандарт де-факто. Поддерживает параметризованные тесты, расширения через
@ExtendWithи отложенное выполнение (assertAll). - TestNG — альтернатива с расширенными возможностями: группы тестов, зависимости, параллельный запуск из коробки.
Мокирование и изоляция:
- Mockito — наиболее популярный фреймворк для создания mock, stub и spy объектов. Позволяет проверять взаимодействия (
verify).
Интеграционное и E2E тестирование:
- Selenium WebDriver — для автоматизации UI веб-приложений. Управляет браузером через драйвер.
- REST Assured — DSL для тестирования REST API. Упрощает валидацию JSON/XML ответов и статус-кодов.
- Cucumber — для Behavior-Driven Development (BDD). Тесты пишутся на языке Gherkin в
.featureфайлах.
Типичные комбинации:
- Unit-тесты: JUnit 5 + Mockito.
- API-тесты: JUnit 5/TestNG + REST Assured.
- UI-тесты: JUnit 5/TestNG + Selenium WebDriver.
- BDD: Cucumber + JUnit (как раннер).
Пример unit-теста с JUnit 5 и Mockito:
@Test
@DisplayName("Should return user by id")
void shouldReturnUserById() {
// Arrange
User mockUser = new User(1L, "John");
when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));
// Act
User result = userService.getUserById(1L);
// Assert
assertEquals("John", result.getName());
verify(userRepository).findById(1L); // Проверка вызова
}
Пример теста API с REST Assured:
@Test
void testGetUserEndpoint() {
given()
.baseUri("https://api.example.com")
.param("id", 123)
.when()
.get("/users")
.then()
.statusCode(200)
.body("name", equalTo("Alice"))
.body("age", greaterThan(18));
} Ответ 18+ 🔞
Да ты посмотри, какая хуйня развелась — фреймворков для тестов, как собак нерезаных! А выбрать-то надо, но тут, блядь, всё просто, как три копейки: смотри, на что ты свой код, сука, проверять собрался.
Для этих ваших юнит-тестов, там, где по одному классу долбишь:
- JUnit 5 — это, блядь, святое, как икона в красном углу. Все его юзают, и правильно делают. Там и параметры в тесты засунуть можно, и кучу расширений прикрутить. Без него — нихуя.
- TestNG — ну, типа, альтернатива. Если тебе, блядь, очень уж надо группы тестов делать или от других тестов зависеть. Но в целом, JUnit'ом мир не сошёлся клином.
А вот когда тебе надо от соседей по коду отгородиться, чтобы они в твой тест не лезли:
- Mockito — вот это, сука, мастхэв! Хочешь заглушить вызов к базе? Пожалуйста! Проверить, что метод вызвался ровно один раз? Да легко! Без него как без рук, честное слово.
Ну а если уже всю систему, блядь, целиком проверяешь, от задницы до мозгов:
- Selenium WebDriver — это когда в браузере кнопки тыкать надо автоматически. Весёлое занятие, я тебе скажу, особенно когда верстка кривая.
- REST Assured — о, это для APIшек, красота! Написал три строчки — и уже проверяешь, что тебе сервер не хуйню какую-то в ответ прислал, а нормальный JSON.
- Cucumber — это для любителей поболтать. Пишешь тесты чуть ли не на русском языке, в файликах с расширением
.feature. Бизнес-аналитики, блядь, просто пищат от восторга.
Собираем паззл, блядь:
- Юниты: Берешь JUnit 5, херачишь в него Mockito — и вперёд, покрывай свою жопу тестами.
- API: JUnit 5 или TestNG цепляешь к REST Assured — и поехали долбить эндпоинты.
- Веб-морда: Опять же, JUnit/TestNG + Selenium. Сидишь, смотришь, как браузер сам всё кликает — гипнотизирующее зрелище, ёпта.
- BDD (это который "поведенческий"): Cucumber + JUnit, чтобы эти твои feature-файлы запускать. Для галочки, в общем.
Смотри, как юнит-тест на коленке пишется (JUnit 5 + Mockito):
@Test
@DisplayName("Должен вернуть пользователя по айдишнику")
void shouldReturnUserById() {
// Подготовка (Arrange)
User mockUser = new User(1L, "Васян");
when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));
// Действие (Act)
User result = userService.getUserById(1L);
// Проверка (Assert)
assertEquals("Васян", result.getName());
verify(userRepository).findById(1L); // А ну-ка, проверься, вызывался ли метод!
}
А вот так APIшку потрошат с REST Assured:
@Test
void testGetUserEndpoint() {
given()
.baseUri("https://api.example.com")
.param("id", 123)
.when()
.get("/users")
.then()
.statusCode(200)
.body("name", equalTo("Алиса"))
.body("age", greaterThan(18));
}
Короче, суть в чём: бери инструмент под задачу, а не потому что он модный. И пиши тесты, а то потом, когда всё на боевом ебнётся, будешь, как Герасим, «Му-му» мычать от безысходности.