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]
- Этап подготовки — на этом этапе формируется инфраструктура теста. Различается два уровня подготовки: подготовка на уровне класса, при которой создаётся и повторно используется трудоёмкий объект (например, подключение к базе данных) с минимальными побочными эффектами; реализуется с помощью аннотации @BeforeAll. Второй тип — подготовка перед запуском каждого теста с помощью аннотации @BeforeEach[6].
- Исполнение теста — на этом этапе осуществляется запуск и проверка результата теста. Итог определяет успешность выполнения или ошибку. Используется аннотация @Test[6].
- Этап очистки — после выполнения всех тестов системе может потребоваться очистка ресурсов. Аналогично подготовке на уровне класса, существует очистка с помощью @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]
- Обратные вызовы жизненного цикла теста — позволяют запускать код в определённых фазах выполнения теста[18].
- Постобработка тестового экземпляра — даёт возможность перехватывать фазу создания экземпляра теста через интерфейс
TestInstancePostProcessor[19]. - Условное выполнение тестов — позволяет запускать тесты только при соблюдении определённых условий[20].
- Разрешение параметров — поддержка внедрения параметров в методы теста или конструкторы.
- Обработка исключений — позволяет изменить поведение теста при возникновении исключений[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].
Примечания
- ↑ Change license to EPL v2.0. github.com (7 сентября 2017). Дата обращения: 4 февраля 2021. Архивировано 3 декабря 2024 года.
- ↑ 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.
- ↑ We Analyzed 30,000 GitHub Projects – Here Are The Top 100 Libraries in Java, JS and Ruby. takipiblog.com. Дата обращения: 9 февраля 2014. Архивировано 9 июля 2014 года.
- ↑ Что нового в JUnit 6: ключевые изменения и улучшения, Хабр. Дата обращения: 23 марта 2026.
- ↑ Stefan Bechtold, Sam Brannen, Johannes Link, Matthias Merdes, Marc Philipp, Juliette de Rancourt, Christian Stein. JUnit Release Notes. web.archive.org. Дата обращения: 23 марта 2026.
- ↑ 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.
- ↑ 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.
- ↑ Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Средства сборки : Apress, 2017. — P. 99–117. — ISBN 978-1-4842-3014-5.
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 6: Интеграция инструментов. Расширение Maven : Apress, 2017. — P. 115. — ISBN 978-1-4842-3014-5.
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Обратные вызовы жизненного цикла теста : Apress, 2017. — P. 124–126. — ISBN 978-1-4842-3014-5.
- ↑ Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Постобработка экземпляра теста : Apress, 2017. — P. 126–127. — ISBN 978-1-4842-3014-5.
- ↑ Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Условное выполнение тестов : Apress, 2017. — P. 127. — ISBN 978-1-4842-3014-5.
- ↑ Gulati, Shekhar. Java Unit Testing with JUnit 5 / Shekhar Gulati, Rahul Sharma. — §Глава 7: Обработка исключений : Apress, 2017. — P. 129. — ISBN 978-1-4842-3014-5.
- ↑ Kent Beck. Expensive Setup Smell. C2 Wiki. Дата обращения: 28 ноября 2011. Архивировано 24 апреля 2002 года.
- ↑ 1 2 Writing Tests. junit.org. Дата обращения: 4 февраля 2021. Архивировано 21 апреля 2016 года.
- ↑ 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.
- ↑ bliki: Xunit. martinfowler.com. Дата обращения: 7 марта 2022. Архивировано 9 февраля 2006 года.
- ↑ JUnit. mvnrepository.com. Дата обращения: 29 октября 2021. Архивировано 9 ноября 2024 года.
- ↑ JUnit Cookbook. junit.sourceforge.net. Дата обращения: 21 мая 2011. Архивировано 15 июня 2020 года.
- ↑ Migrating from JUnit 3 to JUnit 4: Nothing But Good News. Object Computing, Inc. (август 2007). Дата обращения: 4 февраля 2021. Архивировано 17 мая 2025 года.
Ссылки
- Официальный сайт JUnit
- Irriger, Axel JUnit — Open Source Java Unit Testing Tool. Methods and Tools.
- JUnit. Memory Not Found. Архивировано 28 января 2015 года.