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

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

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

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

// Второе утверждение (проверка на слово)
if (!"Hello".equals(cStringUtils.apitalize("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)

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

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

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

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

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

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

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

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

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

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

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

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

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

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

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

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

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»