← Назад к вопросам

В чем разница между Hard и Soft assertions?

2.0 Middle🔥 112 комментариев
#Теория тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Hard и Soft Assertions

При автоматизации тестирования ассерты (assertions) используются для проверки соответствия фактического результата ожидаемому. Ключевое различие между hard assertion (жесткой проверкой) и soft assertion (мягкой проверкой) заключается в поведении при падении: hard assertion немедленно прерывает выполнение теста, а soft assertion продолжает его, собирая все ошибки для отчета в конце.

Hard Assertion (Жесткая проверка)

Hard assertion — это классический вид проверки, который при неудаче немедленно выбрасывает исключение (AssertionError или подобное), прерывая выполнение текущего тестового метода. Все последующие шаги в этом тесте не выполняются.

Характеристики hard assertion:

  • Немедленное прерывание: Тест останавливается при первой же неудачной проверке.
  • Простота использования: Стандартные ассерты в большинстве фреймворков (JUnit, TestNG, pytest) являются жесткими по умолчанию.
  • Экономия времени: Если критически важная проверка провалилась, нет смысла выполнять оставшиеся, часто зависимые, шаги.
  • Ограниченная видимость: В одном прогоне теста вы увидите только первую обнаруженную ошибку.

Пример использования в TestNG (Java):

import org.testng.Assert;
import org.testng.annotations.Test;

public class HardAssertExample {
    @Test
    public void testUserProfile() {
        // Шаг 1: Проверка имени пользователя
        String actualName = getUserName(); // допустим, метод возвращает "Ivan"
        Assert.assertEquals(actualName, "Ivan", "Имя пользователя не совпадает");
        // Если здесь Assert упадет, следующие строки выполнены не будут.

        // Шаг 2: Проверка email (выполнится, только если первый Assert прошел)
        String actualEmail = getUserEmail();
        Assert.assertEquals(actualEmail, "ivan@example.com", "Email не совпадает");

        // Шаг 3: Проверка уровня доступа
        int actualAccessLevel = getAccessLevel();
        Assert.assertTrue(actualAccessLevel > 0, "Уровень доступа должен быть положительным");
    }
}

Soft Assertion (Мягкая проверка)

Soft assertion — это подход, при котором неудачные проверки не прерывают выполнение теста немедленно. Все проверки выполняются до конца, а их результаты (успешные и неуспешные) аккумулируются. В конце теста все накопленные ошибки выбрасываются одним исключением, что дает полную картину всех провалов в тесте.

Характеристики soft assertion:

  • Накопление ошибок: Все проверки выполняются, ошибки собираются.
  • Полная картина провала: В отчете вы видите все проблемы, обнаруженные за один прогон теста.
  • Повышенная сложность: Требует явного вызова методов для сбора результатов и финализации проверки.
  • Потенциальная избыточность: Может выполнять лишние шаги после критического провала, если они не зависят друг от друга.

Реализация soft assertion: Во многих фреймворках soft assertion не встроены напрямую, но реализуются с помощью специальных классов.

Пример использования SoftAssert в TestNG (Java):

import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;

public class SoftAssertExample {
    @Test
    public void testRegistrationForm() {
        SoftAssert softAssert = new SoftAssert();

        // Заполняем форму и получаем результаты валидации
        String usernameError = validateUsername(""); // Пустое имя
        String emailError = validateEmail("invalid-email"); // Неверный email
        String passwordError = validatePassword("123"); // Слишком короткий пароль

        // Все проверки выполнятся, независимо от результата
        softAssert.assertEquals(usernameError, "", "Ошибка валидации имени");
        softAssert.assertEquals(emailError, "", "Ошибка валидации email");
        softAssert.assertEquals(passwordError, "", "Ошибка валидации пароля");

        // Критический шаг в конце: если были ошибки, тест упадет здесь,
        // выведя ВСЕ сообщения об ошибках.
        softAssert.assertAll();
    }
}

Сравнительная таблица

КритерийHard AssertionSoft Assertion
Поведение при паденииНемедленное прерывание теста.Продолжение выполнения до явного вызова assertAll().
Количество видимых ошибок за прогонТолько первая ошибка.Все ошибки, произошедшие до вызова assertAll().
Использование в кодеПростое, стандартное.Требует создания объекта и вызова финализирующего метода.
ЭффективностьЭкономит время и ресурсы при критическом провале.Позволяет за один проход проверить множество условий, но может выполнять ненужные после провала действия.
Идеальный сценарийПроверки строго зависимы друг от друга (пример: нельзя проверить заказ, если не авторизовался).Проверка множества независимых полей формы, параметров конфигурации, элементов на странице.

Когда что использовать?

  • Используйте Hard Assertion, когда:
    *   Последующие шаги теста абсолютно зависят от успеха предыдущих (например, нельзя добавить товар в корзину, не залогинившись).
    *   Необходима максимальная скорость выполнения падающего теста.
    *   Тест простой и проверяет одну ключевую функциональность.

  • Используйте Soft Assertion, когда:
    *   Вы проводите **валидацию формы** с множеством полей и хотите увидеть все ошибки разом.
    *   Вы проверяете **контент страницы** (наличие всех виджетов, заголовков, элементов).
    *   Вы тестируете **конфигурацию или настройки**, где нужно проверить множество независимых параметров.
    *   Цель теста — собрать **максимально полную диагностическую информацию** об состоянии системы за один прогон.

Вывод: Выбор между hard и soft assertion — это компромисс между скоростью выполнения и полнотой отчета об ошибках. Грамотное комбинирование обоих подходов (например, используя hard assert для критического пути логина, а soft — для проверки данных на главной странице) является признаком зрелого подхода к проектированию автотестов.

В чем разница между Hard и Soft assertions? | PrepBro