TL;DR

  • JUnit 5: Современный, расширяемый, стандарт для unit тестов, Spring интеграция
  • TestNG: Богатый функционал, параллельное выполнение, data providers, Selenium-friendly
  • Для unit тестов: JUnit 5 (индустриальный стандарт, лучшая IDE поддержка)
  • Для Selenium/E2E: TestNG (группы, параллелизм, отчёты) или JUnit 5 (современный)
  • Миграция: JUnit 5 и TestNG теперь имеют схожие функции

Время чтения: 9 минут

JUnit и TestNG — доминирующие Java фреймворки тестирования. JUnit — стандарт для unit тестирования, TestNG появился чтобы добавить недостающие в JUnit функции. JUnit 5 значительно сократил разрыв.

Быстрое Сравнение

ФункцияJUnit 5TestNG
Релиз2017+2004+
Аннотации@Test, @BeforeEach и др.@Test, @BeforeMethod и др.
Параллельное выполнениеДа (конфиг)Да (встроенное)
Data-driven@ParameterizedTest@DataProvider
Группировка тестов@Tag@Groups
Зависимости@OrderdependsOnMethods
ОтчётностьБазовая + плагиныБогатая встроенная
XML конфигурацияНетtestng.xml
Spring интеграцияОтличнаяХорошая

Сравнение Аннотаций

Жизненный Цикл Тестов

НазначениеJUnit 5TestNG
Тест метод@Test@Test
Перед каждым тестом@BeforeEach@BeforeMethod
После каждого теста@AfterEach@AfterMethod
Перед всеми тестами@BeforeAll@BeforeClass
После всех тестов@AfterAll@AfterClass
Перед suite@BeforeSuite
После suite@AfterSuite

TestNG имеет более гранулярные lifecycle аннотации.

Примеры Тестов

JUnit 5 Тест

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;

@DisplayName("Calculator Tests")
class CalculatorTest {

    private Calculator calc;

    @BeforeEach
    void setUp() {
        calc = new Calculator();
    }

    @Test
    @DisplayName("Addition works correctly")
    void testAddition() {
        assertEquals(5, calc.add(2, 3));
    }

    @Test
    @Tag("slow")
    void testComplexOperation() {
        // Тегирован для выборочного выполнения
        assertNotNull(calc.complexCalc());
    }
}

TestNG Тест

import org.testng.annotations.*;
import static org.testng.Assert.*;

public class CalculatorTest {

    private Calculator calc;

    @BeforeMethod
    public void setUp() {
        calc = new Calculator();
    }

    @Test(description = "Addition works correctly")
    public void testAddition() {
        assertEquals(calc.add(2, 3), 5);
    }

    @Test(groups = {"slow"})
    public void testComplexOperation() {
        // Группирован для выборочного выполнения
        assertNotNull(calc.complexCalc());
    }
}

Data-Driven Тестирование

JUnit 5 Параметризованные Тесты

@ParameterizedTest
@CsvSource({
    "2, 3, 5",
    "0, 0, 0",
    "-1, 1, 0"
})
void testAddition(int a, int b, int expected) {
    assertEquals(expected, calc.add(a, b));
}

@ParameterizedTest
@MethodSource("provideNumbers")
void testWithMethodSource(int a, int b, int expected) {
    assertEquals(expected, calc.add(a, b));
}

static Stream<Arguments> provideNumbers() {
    return Stream.of(
        Arguments.of(2, 3, 5),
        Arguments.of(0, 0, 0)
    );
}

TestNG DataProvider

@DataProvider(name = "additionData")
public Object[][] provideData() {
    return new Object[][] {
        {2, 3, 5},
        {0, 0, 0},
        {-1, 1, 0}
    };
}

@Test(dataProvider = "additionData")
public void testAddition(int a, int b, int expected) {
    assertEquals(calc.add(a, b), expected);
}

DataProvider TestNG проще для сложных данных.

Параллельное Выполнение

JUnit 5 Параллельный

# junit-platform.properties
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent
junit.jupiter.execution.parallel.config.strategy = fixed
junit.jupiter.execution.parallel.config.fixed.parallelism = 4

TestNG Параллельный

<!-- testng.xml -->
<suite name="Parallel Suite" parallel="methods" thread-count="4">
    <test name="Tests">
        <classes>
            <class name="com.example.CalculatorTest"/>
        </classes>
    </test>
</suite>

XML конфигурация TestNG даёт больше контроля над параллельным выполнением.

Зависимости Тестов

JUnit 5 Упорядочивание

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class OrderedTest {

    @Test
    @Order(1)
    void createUser() { }

    @Test
    @Order(2)
    void verifyUser() { }
}

TestNG Зависимости

@Test
public void createUser() { }

@Test(dependsOnMethods = {"createUser"})
public void verifyUser() { }

@Test(dependsOnGroups = {"setup"})
public void runAfterSetup() { }

TestNG имеет явные зависимости методов; JUnit использует упорядочивание.

Когда Выбрать JUnit 5

  1. Unit тестирование — индустриальный стандарт для Java unit тестов
  2. Spring проекты — отличная Spring Boot интеграция
  3. IDE поддержка — лучший тулинг в IntelliJ и Eclipse
  4. Современная Java — создан для Java 8+ с лямбдами
  5. Простые проекты — меньше конфигурации нужно

Когда Выбрать TestNG

  1. Selenium тестирование — устоявшийся в браузерной автоматизации
  2. Сложные тест-сьюты — XML конфигурация, группы
  3. Enterprise тестирование — обширная отчётность, listeners
  4. Параллельное выполнение — более гранулярный контроль
  5. Legacy проекты — существующая TestNG инфраструктура

FAQ

TestNG лучше JUnit?

TestNG предлагает больше встроенных функций: параллельное выполнение, data providers, гибкая группировка и богатая отчётность. JUnit 5 значительно подтянулся с параметризованными тестами, параллельным выполнением и тегами. Выбирай TestNG для сложной тест-автоматизации и Selenium проектов, JUnit 5 для стандартного unit тестирования и Spring приложений.

TestNG или JUnit для Selenium?

TestNG традиционно предпочтительнее для Selenium из-за параллельного выполнения браузеров, группировки тестов, зависимостей методов и встроенной отчётности. Однако JUnit 5 теперь адекватно поддерживает эти функции. Оба одинаково хорошо работают с Selenium WebDriver. Выбирай исходя из опыта команды и существующей инфраструктуры.

Можно использовать TestNG и JUnit вместе?

Технически да, но не рекомендуется в одном модуле. Некоторые проекты используют JUnit для unit тестов и TestNG для интеграционных/Selenium тестов в отдельных модулях. Это добавляет сложность. Большинство команд выбирают один фреймворк для единообразия и простоты конфигурации сборки.

Что популярнее?

JUnit имеет большее общее распространение, особенно для unit тестирования. TestNG популярен в enterprise QA и Selenium автоматизации. Оба активно поддерживаются с сильными сообществами. Современные функции JUnit 5 привлекли многих пользователей TestNG, тогда как TestNG сохраняет лояльность в тест-автоматизации.

Смотрите также