Какие assertions есть в TestNG/JUnit?qa-65

Assertions (утверждения) — это ключевой механизм проверки ожидаемых результатов в тестах. Рассмотрим основные варианты в TestNG и JUnit с примерами.

1. Базовые assertions в TestNG

1.1 Основные проверки

import static org.testng.Assert.*;

@Test
public void basicAssertions() {
    assertEquals(actual, expected);  // Проверка равенства
    assertNotEquals(actual, unexpected);  // Проверка неравенства
    assertTrue(condition);  // Проверка истинности
    assertFalse(condition);  // Проверка ложности
    assertNull(object);  // Проверка на null
    assertNotNull(object);  // Проверка на not null
}

1.2 Сравнение коллекций

@Test
public void collectionAssertions() {
    List<String> actual = Arrays.asList("a", "b", "c");
    List<String> expected = Arrays.asList("a", "b", "c");

    assertEqualsNoOrder(actual.toArray(), expected.toArray());  // Без учета порядка
    assertEquals(actual, expected);  // С учетом порядка
}

2. Продвинутые assertions в TestNG

2.1 Проверка исключений

@Test(expectedExceptions = NullPointerException.class)
public void exceptionTest() {
    String str = null;
    str.length();
}

2.2 Мягкие assertions

@Test
public void softAssertTest() {
    SoftAssert softAssert = new SoftAssert();
    softAssert.assertEquals(1, 2, "Первая проверка");
    softAssert.assertTrue(false, "Вторая проверка");
    softAssert.assertAll();  // Выводит все ошибки
}

3. Assertions в JUnit 5

3.1 Базовые проверки

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

@Test
void junitAssertions() {
    assertEquals(expected, actual);
    assertNotEquals(unexpected, actual);
    assertTrue(condition);
    assertFalse(condition);
    assertNull(object);
    assertNotNull(object);
}

3.2 Продвинутые проверки

@Test
void advancedJunitAssertions() {
    assertAll(
        () -> assertEquals(1, 1),
        () -> assertTrue(true),
        () -> assertNull(null)
    );

    assertThrows(NullPointerException.class, () -> {
        String str = null;
        str.length();
    });
}

4. Сравнение возможностей

Тип проверки TestNG JUnit 5
Базовые равенства assertEquals() assertEquals()
Коллекции assertEqualsNoOrder() assertIterableEquals()
Исключения @Test(expectedExceptions) assertThrows()
Групповые проверки SoftAssert assertAll()
Таймауты assertTimeout() assertTimeoutPreemptively()

5. Лучшие практики использования

  1. Читаемость: Добавляйте поясняющие сообщения

    assertEquals(actual, expected, "Сообщение при ошибке");
    
  2. Специфичные проверки: Используйте наиболее подходящий assertion

  3. Группировка: Для нескольких проверок используйте assertAll/SoftAssert

  4. Производительность: Размещайте "тяжелые" проверки в конце

6. Альтернативные библиотеки assertions

  • AssertJ: Более читаемый fluent-синтаксис

    assertThat(actual).isEqualTo(expected).isNotNull();
    
  • Hamcrest: Матчеры для сложных проверок

    assertThat(actual, allOf(containsString("text"), hasLength(5)));
    

Резюмируем:

TestNG и JUnit предоставляют богатый набор assertions для различных сценариев проверок. TestNG предлагает SoftAssert для накопления ошибок, в то время как JUnit 5 имеет более современный синтаксис с assertAll(). Для сложных проверок стоит рассмотреть AssertJ или Hamcrest.