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 5 | TestNG |
|---|---|---|
| Релиз | 2017+ | 2004+ |
| Аннотации | @Test, @BeforeEach и др. | @Test, @BeforeMethod и др. |
| Параллельное выполнение | Да (конфиг) | Да (встроенное) |
| Data-driven | @ParameterizedTest | @DataProvider |
| Группировка тестов | @Tag | @Groups |
| Зависимости | @Order | dependsOnMethods |
| Отчётность | Базовая + плагины | Богатая встроенная |
| XML конфигурация | Нет | testng.xml |
| Spring интеграция | Отличная | Хорошая |
Сравнение Аннотаций
Жизненный Цикл Тестов
| Назначение | JUnit 5 | TestNG |
|---|---|---|
| Тест метод | @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
- Unit тестирование — индустриальный стандарт для Java unit тестов
- Spring проекты — отличная Spring Boot интеграция
- IDE поддержка — лучший тулинг в IntelliJ и Eclipse
- Современная Java — создан для Java 8+ с лямбдами
- Простые проекты — меньше конфигурации нужно
Когда Выбрать TestNG
- Selenium тестирование — устоявшийся в браузерной автоматизации
- Сложные тест-сьюты — XML конфигурация, группы
- Enterprise тестирование — обширная отчётность, listeners
- Параллельное выполнение — более гранулярный контроль
- 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 сохраняет лояльность в тест-автоматизации.
Смотрите также
- JUnit Tutorial - Полное руководство по JUnit 5
- TestNG Tutorial - Полное руководство по TestNG
- Selenium Tutorial - Основы WebDriver
- Java Testing Best Practices - Стратегии тестирования
