Подключаем JUnit к Maven-проекту для тестирования Java-приложения

User Rating: 0 / 5

Для тестирования 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-тестов! Покрытие кода модульными тестами - это хорошая практика разработки программного обеспечения.

Спасибо за внимание, пишите свои вопросы и комментарии внизу данной статьи. До встречи!

Яндекс.Метрика