JUnit

JUnitфреймворк для автоматизированного тестирования программ на языке Java. JUnit широко применяется для модульного тестирования и является одним из представителей семейства xUnit-фреймворков.

JUnit подключается в качестве JAR-библиотеки на этапе компиляции. Актуальная версия, JUnit 5, размещается в пакете org.junit.jupiter[2]. В предыдущих версиях, JUnit 4[2] и JUnit 3, использовались пакеты org.junit и junit.framework соответственно.

Согласно исследованию, проведённому в 2013 году на 10 000 проектов на Java, размещённых на GitHub, JUnit (наряду с slf4j-api) был самой часто используемой внешней библиотекой: доля использования каждой составила 30,7 % проектов[3].

В 2025 году основным событием стал переход на JUnit 6, который принес значительные архитектурные изменения и ориентацию на современные версии языка[4][5].

Общие сведения
JUnit
Тип средство модульного тестирования
Разработчики Кент Бек, Эрих Гамма, Дэвид Сафф
Написана на Java
Операционная система кроссплатформенное ПО
Аппаратная платформа Java Virtual Machine
Последняя версия 5.13.1 (7 июня 2025)
Репозиторий github.com/junit-team/ju…
Лицензия Eclipse Public License 2.0[1] (ранее использовалась другая лицензия)
Сайт junit.org

Жизненный цикл JUnit

Каждый тестовый класс в JUnit, как правило, содержит несколько тестовых случаев, проходящих определённый жизненный цикл. Полный жизненный цикл JUnit включает три основных этапа:[6]

  1. Этап подготовки — на этом этапе формируется инфраструктура теста. Различается два уровня подготовки: подготовка на уровне класса, при которой создаётся и повторно используется трудоёмкий объект (например, подключение к базе данных) с минимальными побочными эффектами; реализуется с помощью аннотации @BeforeAll. Второй тип — подготовка перед запуском каждого теста с помощью аннотации @BeforeEach[6].
  2. Исполнение теста — на этом этапе осуществляется запуск и проверка результата теста. Итог определяет успешность выполнения или ошибку. Используется аннотация @Test[6].
  3. Этап очистки — после выполнения всех тестов системе может потребоваться очистка ресурсов. Аналогично подготовке на уровне класса, существует очистка с помощью @AfterAll. Очистку после каждого теста реализует аннотация @AfterEach[6].

Интеграция с другими инструментами

JUnit 5 поддерживает множество внешних инструментов: средства сборки проектов, IDE, системы непрерывной интеграции и другие[7].

Средства сборки

JUnit поддерживает популярные средства сборки проектов: Apache Ant, Apache Maven и Gradle[8]. Такие инструменты важны для автоматизации процесса сборки проекта[7].

Поддержка Ant

Ant — одно из наиболее универсальных и старейших средств сборки[9]. В центре конфигурирования находится файл build.xml, описывающий задачи сборки[9]. Для управления зависимостями используется расширение Apache Ivy, где зависимости проекта объявляются в ivy.xml. Для интеграции с JUnit 5 через Ant можно настроить инструменты анализа покрытия кода (JaCoCo) и указать в ivy.xml необходимые зависимости (java-platform-console и junit-platform-runner)[9][10].

Поддержка Maven

В отличие от Ant, Maven реализует унифицированный подход к сборке и управление зависимостями по принципу «конвенция важнее конфигурирования»[11][12]. Исходный Java-код размещается в папке src/main/java, а файлы тестов — в src/test/java[12]. Maven может применяться в любых Java-проектах, используя XML-файл Project Object Model (POM) pom.xml, где хранятся шаги сборки и список зависимостей[11]. Для интеграции с JUnit 5 используется плагин jacoco-maven-plugin с поддержкой соответствующих целей, необходимых для тестирования[13].

Поддержка Gradle

Gradle сочетает подходы Ant и Maven[12]. Для описания сценария сборки используется файл build.gradle на языке Apache Groovy, а не на XML[12]. Gradle придерживается структуры Maven для src/main/java и src/test/java[12]. Для интеграции с JUnit 5 в build-файле настраивают плагины jacoco и junit-platform[14].

Модель расширения JUnit

JUnit реализует принцип приоритета точек расширения над предустановленными возможностями[15]. Вместо «запекания» всех функций в ядро, разработчики JUnit предоставили расширяемый API.

В JUnit 4 существовало два механизма расширения: Runner API и Rule API[16]. Оба имели свои ограничения:

  • Runner API требовал реализации полного жизненного цикла теста даже для частных случаев, а использовать одновременно несколько Runner'ов для одного класса было невозможно (например, сочетать Mockito и Parameterized)[16].
  • Rule API не обеспечивал контроль полного жизненного цикла теста и требовал разделять правила для класса и метода[16].

В JUnit 5 расширяемость реализована внутри JUnit Jupiter Engine — введён универсальный API для подключения расширений[17]. На каждом этапе жизненного цикла движок вызывает все зарегистрированные расширения для соответствующей фазы. Поддерживаются пять ключевых точек расширения:[17]

  1. Обратные вызовы жизненного цикла теста — позволяют запускать код в определённых фазах выполнения теста[18].
  2. Постобработка тестового экземпляра — даёт возможность перехватывать фазу создания экземпляра теста через интерфейс TestInstancePostProcessor[19].
  3. Условное выполнение тестов — позволяет запускать тесты только при соблюдении определённых условий[20].
  4. Разрешение параметров — поддержка внедрения параметров в методы теста или конструкторы.
  5. Обработка исключений — позволяет изменить поведение теста при возникновении исключений[21].

Пример тестового класса (fixture) JUnit

Тестовый класс (fixture) JUnit — это Java-объект. Методы тестов помечаются аннотацией @Test. При необходимости можно определить методы, выполняющиеся до или после каждого (или всех) тестовых методов: для этого используются аннотации @BeforeEach, @AfterEach, @BeforeAll, @AfterAll.[22][23][24]

import org.junit.jupiter.api.*;

class FoobarTests {
    @BeforeAll
    static void setUpClass() throws Exception {
        // Код, выполняемый перед первым тестовым методом
    }

    @BeforeEach
    void setUp() throws Exception {
        // Код, выполняемый перед каждым тестом
    }

    @Test
    void oneThing() {
        // Тест проверяет одну функциональность
    }

    @Test
    void anotherThing() {
        // Тест проверяет другую функциональность
    }

    @Test
    void somethingElse() {
        // Тест проверяет что-то ещё
    }

    @AfterEach
    void tearDown() throws Exception {
        // Код, выполняемый после каждого теста 
    }

    @AfterAll
    static void tearDownClass() throws Exception {
        // Код, выполняемый после завершения всех тестовых методов 
    }
}

Предыдущие версии JUnit

Мартин Фаулер, один из первых пользователей JUnit, описывает историю появления:[25]

JUnit был создан во время перелёта из Цюриха на OOPSLA 1997 в Атланте. Кент летел с Эрихом Гамма, и, как иначе трем гикам скоротать время, кроме как программировать? Первая версия JUnit была написана в полёте в парном режиме с тестовой разработкой (в стиле мета-циркулярного гикства).

Благодаря широкой популярности, ранние версии JUnit до сих пор востребованы. JUnit 4 насчитывает более 100 000 использований в других ПО на Maven Central[26].

В JUnit 4 аннотации для обратных вызовов выглядели как @BeforeClass, @Before, @After, @AfterClass в отличие от JUnit 5: @BeforeAll, @BeforeEach, @AfterEach, @AfterAll[23][24].

В JUnit 3 требовалось наследовать тестовые классы от junit.framework.TestCase[27]. Также требовалось, чтобы имя метода теста начиналось с префикса test[28].

Примечания

  1. Change license to EPL v2.0. github.com (7 сентября 2017). Дата обращения: 4 февраля 2021. Архивировано 3 декабря 2024 года.
  2. 1 2 Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 8: Динамические тесты и миграция с JUnit 4, стр. 144 : Apress, 2017. — ISBN 978-1-4842-3014-5. — doi:10.1007/978-1-4842-3015-2.
  3. We Analyzed 30,000 GitHub Projects – Here Are The Top 100 Libraries in Java, JS and Ruby. takipiblog.com. Дата обращения: 9 февраля 2014. Архивировано 9 июля 2014 года.
  4. Что нового в JUnit 6: ключевые изменения и улучшения, Хабр. Дата обращения: 23 марта 2026.
  5. Stefan Bechtold, Sam Brannen, Johannes Link, Matthias Merdes, Marc Philipp, Juliette de Rancourt, Christian Stein. JUnit Release Notes. web.archive.org. Дата обращения: 23 марта 2026.
  6. 1 2 3 4 Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 2: API жизненного цикла JUnit : Apress, 2017. — P. 37–40. — ISBN 978-1-4842-3014-5.
  7. 1 2 Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Интеграция инструментов : Apress, 2017. — P. 99. — ISBN 978-1-4842-3014-5.
  8. Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Средства сборки : Apress, 2017. — P. 99–117. — ISBN 978-1-4842-3014-5.
  9. 1 2 3 Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Интеграция инструментов. Средства сборки — Ant : Apress, 2017. — P. 108–112. — ISBN 978-1-4842-3014-5.
  10. Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Интеграция инструментов. Расширение Ant : Apress, 2017. — P. 116–117. — ISBN 978-1-4842-3014-5.
  11. 1 2 Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Интеграция инструментов. Средства сборки — Maven : Apress, 2017. — P. 104–108. — ISBN 978-1-4842-3014-5.
  12. 1 2 3 4 5 Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Интеграция инструментов. Средства сборки — Gradle : Apress, 2017. — P. 99–103. — ISBN 978-1-4842-3014-5.
  13. Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Интеграция инструментов. Расширение Maven : Apress, 2017. — P. 115. — ISBN 978-1-4842-3014-5.
  14. Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Интеграция инструментов. Расширение Gradle : Apress, 2017. — P. 113–114. — ISBN 978-1-4842-3014-5.
  15. Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Модель расширений JUnit 5 : Apress, 2017. — P. 121. — ISBN 978-1-4842-3014-5.
  16. 1 2 3 Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Модель расширений JUnit 4 : Apress, 2017. — P. 121–122. — ISBN 978-1-4842-3014-5.
  17. 1 2 Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Модель расширений JUnit 5 : Apress, 2017. — P. 122–124. — ISBN 978-1-4842-3014-5.
  18. Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Обратные вызовы жизненного цикла теста : Apress, 2017. — P. 124–126. — ISBN 978-1-4842-3014-5.
  19. Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Постобработка экземпляра теста : Apress, 2017. — P. 126–127. — ISBN 978-1-4842-3014-5.
  20. Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Условное выполнение тестов : Apress, 2017. — P. 127. — ISBN 978-1-4842-3014-5.
  21. Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Обработка исключений : Apress, 2017. — P. 129. — ISBN 978-1-4842-3014-5.
  22. Kent Beck. Expensive Setup Smell. C2 Wiki. Дата обращения: 28 ноября 2011. Архивировано 24 апреля 2002 года.
  23. 1 2 Writing Tests. junit.org. Дата обращения: 4 февраля 2021. Архивировано 21 апреля 2016 года.
  24. 1 2 Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 2: Основы JUnit 5 : Apress, 2017. — P. 37–40. — ISBN 978-1-4842-3014-5.
  25. bliki: Xunit. martinfowler.com. Дата обращения: 7 марта 2022. Архивировано 9 февраля 2006 года.
  26. JUnit. mvnrepository.com. Дата обращения: 29 октября 2021. Архивировано 9 ноября 2024 года.
  27. JUnit Cookbook. junit.sourceforge.net. Дата обращения: 21 мая 2011. Архивировано 15 июня 2020 года.
  28. Migrating from JUnit 3 to JUnit 4: Nothing But Good News. Object Computing, Inc. (август 2007). Дата обращения: 4 февраля 2021. Архивировано 17 мая 2025 года.

Ссылки