Какие фреймворки используются для автоматизации тестов в Java?

Ответ

Выбор фреймворка зависит от типа тестов. Основные инструменты в экосистеме 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));
}

Короче, суть в чём: бери инструмент под задачу, а не потому что он модный. И пиши тесты, а то потом, когда всё на боевом ебнётся, будешь, как Герасим, «Му-му» мычать от безысходности.