Для тестирования Java-приложения можно использовать один из наиболее популярных и известных фреймворков, позволяющий писать и исполнять модульные тесты (или, по-другому, юнит-тесты, Unit-тесты) - JUnit.
На момент написания этой статьи самой актуальной версией фреймворка JUnit является JUnit 5, а официальный сайт фреймворка - https://junit.org/junit5/
В целом, на официальном сайте фреймворка Вы можете найти всю необходимую документацию и инструкции о том, как подключить и использовать JUnit в Вашем приложении. В частности, руководства по подключению JUnit к Maven-сборке можно найти по этой ссылке: https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven
Но в этой статье я хотел бы рассмотреть и поделиться с вами примером того, как я подключил JUnit к своему приложению. Для сборки тестового проекта я буду использовать Java 11 и встроенный в IntelliJ IDEA Maven версии 3.8.1.
Итак, для начала работы нам потребуется среда разработки IntelliJ IDEA (если у Вас не установлена данная IDE, можно посмотреть статью Первая программа на Java, где я ранее предоставил ссылки на разные IDE при начале разработки на Java и кратко рассматриваю их основные особенности).
Создайте простое тестовое приложение в IntelliJ IDEA при помощи выбора архетипа maven-archetype-quickstart. Детально этот процесс был рассмотрен в статье Первое знакомство с Maven, поэтому здесь я его не буду описывать повторно.
Когда проект создан, и сгенерированы все основные файлы приложения, включая файл pom.xml для сборки проекта при помощи Maven, в этот файл pom.xml я добавляю следующую конфигурацию для подключения JUnit:
1) В секцию dependencies я добавляю зависимость на JUnit с указанием версии 5.0.0:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- здесь идёт остальное содержимое pom.xml -->
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- здесь идёт остальное содержимое pom.xml -->
</project>
2) В секции pluginManagement у меня указан плагин maven-surefire-plugin версии 2.19 с зависимостью на junit-platform-surefire-provider версии 1.0.0. Этот плагин используется во время фазы test жизненного цикла сборки для выполнения Unit-тестов Вашего приложения. Он также генерирует отчёты в двух разных файловых форматах:
- Обычные текстовые файлы (*.txt)
- XML-файлы (*.xml)
По умолчанию эти файлы генерируются в директории ${basedir}/target/surefire-reports/TEST-*.xml.
Помимо плагина manen-surefire-plugin у меня также указан maven-compiler-plugin версии 3.10.1 для компиляции файлов приложения с исходным кодом на Java.
Вот так у меня выглядит часть pom.xml с подключением необходимых плагинов:
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
В целом, это всё, что необходимо для запуска тестов в Вашей Maven-сборке. pom.xml у меня для примера получился минимальный, в нём также есть секция properties с указанием source и target версий Java, а также кодировки исходных файлов Java.
На всякий случай я приведу итоговый pom.xml моего тестового проекта:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.allineed</groupId>
<artifactId>AllineedSamples</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Для демонстрационных целей в моём приложении у меня всего 1 тестовый класс Main, где и расположена точка входа в программу. Он расположен в директории /src/main/java/ru/allineed/ и выглядит следующим образом:
package ru.allineed;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Также у меня есть 1 демонстрационный Unit-тест, чтобы потом показать как он будет выполняться при Maven-сборке нашего приложения (расположен в директории /src/test/java/):
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class SampleTest {
@Test
void myFirstTest() {
assertEquals(2, 1 + 1);
}
}
Теперь можно создать сборочную конфигурацию в IDEA с типом Maven и единственной командой clean install для тестирования сборки нашего приложения. Альтернативно, в правой части IDEA можно открыть панель Maven и нажать в панели инструментов кнопку "m" (Execute Maven Goal). Независимо от способа, который Вы выбрали, запускаем Maven-сборку тестового приложения и увидим примерно следующее (в Вашем случае вывод в консоль может несколько отличаться). Я предоставляю пример вывода консоли не полностью, а с той его части, где начинается интересная информация про работу плагина maven-surefire-plugin и запуск нашего Unit-теста:
[INFO]
[INFO] --- maven-surefire-plugin:2.19:test (default-test) @ AllineedSamples ---
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running SampleTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 sec - in SampleTest
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ AllineedSamples ---
[INFO] Building jar: C:\Users\1\IdeaProjects\AllineedSamples\target\AllineedSamples-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ AllineedSamples ---
[INFO] Installing C:\Users\1\IdeaProjects\AllineedSamples\target\AllineedSamples-1.0-SNAPSHOT.jar to C:\Users\1\.m2\repository\ru\allineed\AllineedSamples\1.0-SNAPSHOT\AllineedSamples-1.0-SNAPSHOT.jar
[INFO] Installing C:\Users\1\IdeaProjects\AllineedSamples\pom.xml to C:\Users\1\.m2\repository\ru\allineed\AllineedSamples\1.0-SNAPSHOT\AllineedSamples-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.069 s
[INFO] Finished at: 2022-08-20T15:19:06+03:00
[INFO] ------------------------------------------------------------------------
Process finished with exit code 0
Как видите, в процессе сборки нашего приложения у нас запустился наш тест с именем SampleTest, также можно видеть статистику по нему:
Running SampleTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 sec - in SampleTest
То есть тест был успешно запущен (поле run: 1), без ошибок (поля Failures, Errors равны 0) и его пропуска при сборке (поле Skipped равно 0).
В конце можно видеть суммарные цифры отчёта по всем исполненным во время сборки Unit-тестам. У нас он всего один в примере, но если бы тестов было больше, то здесь мы бы увидели общее число запущенных Unit-тестов, а также поняли бы, сколько из них выполнено с ошибками:
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
На этом, пожалуй, всё. Пробуйте подключать JUnit к своим приложениям и обязательно покрывайте функциональность своих программ при помощи Unit-тестов! Покрытие кода модульными тестами - это хорошая практика разработки программного обеспечения.
Спасибо за внимание, пишите свои вопросы и комментарии внизу данной статьи. До встречи!