Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Утверждения (Asserts) Java: Автоматическое тестирование

Каждую проверку, которую мы написали для метода StringUtils.capitalize(), в тестировании принято называть утверждением (assert). Утверждения — ключевая часть тестов. Именно они проверяют работу кода:

// Первое утверждение (проверка на пустую строку)
if (!"".equals(StringUtils.capitalize(""))) {
    throw new AssertionError("Метод работает неверно!");
}

// Второе утверждение (проверка на слово)
if (!"Hello".equals(StringUtils.capitalize("hello"))) {
    throw new AssertionError("Метод работает неверно!");
}

Можно заметить, что все проверки строятся одинаковым способом: условие => исключение. Java, начиная с версии 1.4., поддерживает ключевое слово assert, которое предназначено для проверки утверждений:

// Проверка сменилась с отрицательной на положительную
// Утверждение считается пройденным, если условие истинно
assert 4 == 2 + 2;
assert "".equals(StringUtils.capitalize(""));

// Опциональное сообщение об ошибке
// Указывается после двоеточия
assert "Hello".equals(StringUtils.capitalize("hello")) : "Ваш метод не работает!";

Синтаксис достаточно прост:

  1. указываем ключевое слово assert,
  2. пишем выражение или вызываем метод, результатом которого будет булево выражение (true или false),
  3. опционально: после двоеточия можем указать некоторое строковое сообщение, которое будет передано вместе с ошибкой. В общем случае может быть не просто строка, а любое выражение, которое возвращает что-то отличное от void.

В случае если значение после ключевого слова assert будет равно false, то возникнет ошибка (будет выброшено AssertionError). Другими словами, assert true означает что всё хорошо, а assert false говорит об ошибке. Например, если в последнем примере метод StringUtils.capitalize("hello") вернёт что-то отличное от Hello, то мы увидим в консоли вот такое сообщение:

java.lang.AssertionError: Ваш метод не работает!

    at io.hexlet.LessonTest.testMain(LessonTest.java:12)
    ...

В первой строке мы видим какое исключение было проброшено (java.lang.AssertionError) и сообщение, которое мы передали вместе с ним. Кроме сообщения, выводится бектрейс, по которому можно найти сработавшее утверждение. В данном случае необходимо изучать код на 12 строке в классе io.hexlet.LessonTest.

Использование ключевого слова assert сделало наш код короче и проще для восприятия. Положительная проверка смотрится естественнее, так как это то, что мы ожидаем.

Однако, ключевое слово assert было введено только в Java 1.4., это значит что в предыдущих версиях Java вполне можно было создать переменную или метод с именем assert. Программы в которых использовались такие имена могли стать неработоспособными после введения нового ключевого слова. Для сохранения обратной совместимости было принято решение, что по умолчанию механизм использования assert будет отключен. Если нужно чтобы ваши assert срабатывали, то при запуске программы указывается аргумент командной строки -enableassertions (-ea).

Рассмотрим пример. Допустим у нас есть вот такой класс:

class HelloWorld {
    public static void main(String[] args) {
        assert 1 == 2; // заведомо ложное утверждение
        System.out.println("Hello world");
    }
}

Если мы его скомпилируем и запустим без дополнительных аргументов, то мы увидим на экране текст Hello world, несмотря на то, что 1 точно не равно 2. Чтобы включить assert нам необходимо сделать так:

java -ea HelloWorld.java
# Boom!

Тогда в консоли вместо надписи Hello world мы увидим сообщение об ошибке:

Exception in thread "main" java.lang.AssertionError
    at HelloWorld.main(HelloWorld.java:4)

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Java-разработчик
Профессия
с нуля
Разработка приложений на языке Java
2 февраля 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»