«1. Обзор

Наши сборки часто запускают множество автоматических тестов для нашего проекта. К ним относятся модульные и интеграционные тесты. Если выполнение набора тестов занимает много времени, мы можем захотеть оптимизировать наш тестовый код или отследить тесты, которые занимают слишком много времени.

В этом руководстве мы изучим несколько способов определения времени выполнения наших тестовых случаев и наборов тестов.

2. Примеры JUnit

Чтобы продемонстрировать отчеты о времени выполнения, давайте воспользуемся несколькими тестовыми примерами из разных уровней тестовой пирамиды. Мы будем моделировать продолжительность тестового примера с помощью Thread.sleep().

Мы реализуем наши примеры в JUnit 5. Однако эквивалентные инструменты и методы также применимы к тестам, написанным с помощью JUnit 4.

Во-первых, вот тривиальный модульный тест:

@Test
void someUnitTest() {

    assertTrue(doSomething());
}

Во-вторых, давайте есть интеграционный тест, выполнение которого занимает больше времени:

@Test
void someIntegrationTest() throws Exception {

    Thread.sleep(5000);
    assertTrue(doSomething());
}

Наконец, мы можем смоделировать медленный сквозной пользовательский сценарий:

@Test
void someEndToEndTest() throws Exception {

    Thread.sleep(10000);
    assertTrue(doSomething());
}

В оставшейся части статьи мы выполним эти тестовых случаев и определить время их выполнения.

3. IDE JUnit Runner

Самый быстрый способ узнать время выполнения теста JUnit — использовать нашу IDE. Поскольку большинство IDE поставляются со встроенным исполнителем JUnit, они выполняют тесты и сообщают о результатах.

Две самые популярные IDE, IntelliJ и Eclipse, имеют встроенные средства выполнения JUnit.

2.1. IntelliJ JUnit Runner

IntelliJ позволяет нам выполнять тестовые примеры JUnit с помощью конфигураций запуска/отладки. Как только мы выполняем тесты, бегун показывает статус теста вместе со временем выполнения:

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

Нам также может понадобиться сохранить такие отчеты для дальнейшего использования. IntelliJ позволяет нам экспортировать этот отчет в формате HTML или XML. Функция экспорта отчета выделена на панели инструментов на скриншоте выше.

2.2. Eclipse JUnit Runner

Eclipse также предоставляет встроенную программу запуска JUnit. Мы можем выполнить и узнать время выполнения отдельного теста или всего набора тестов в окне результатов теста:

Но, в отличие от средства запуска тестов IntelliJ, мы не можем экспортировать отчет из Eclipse.

3. Плагин Maven Surefire

Плагин Maven Surefire используется для выполнения модульных тестов на этапе тестирования жизненного цикла сборки. Плагин surefire является частью конфигурации Maven по умолчанию. Однако, если требуется конкретная версия или дополнительная конфигурация, мы можем объявить это в pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M3</version>
    <configuration>
        <excludes>
            <exclude>**/*IntegrationTest.java</exclude>
        </excludes>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.3.2</version>
        </dependency>
    </dependencies>
</plugin>

Есть три способа узнать время выполнения тестов JUnit при тестировании с помощью Maven. Мы рассмотрим каждый из них в следующих подразделах.

3.1. Журналы сборки Maven

Surefire отображает состояние и время выполнения каждого теста в журналах сборки:

[INFO] Running com.baeldung.execution.time.SampleExecutionTimeUnitTest
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 15.003 s 
- in com.baeldung.execution.time.SampleExecutionTimeUnitTest

Здесь показано общее время выполнения всех трех тестов в тестовом классе.

3.2. Отчеты о тестах Surefire

Подключаемый модуль surefire также генерирует сводку о выполнении тестов в форматах .txt и .xml. Обычно они хранятся в целевом каталоге проекта. Surefire следует стандартному формату для обоих текстовых отчетов:

----------------------------------------------
Test set: com.baeldung.execution.time.SampleExecutionTimeUnitTest
----------------------------------------------
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 15.003 s 
- in com.baeldung.execution.time.SampleExecutionTimeUnitTest

и отчетов XML:

<?xml version="1.0" encoding="UTF-8"?>
<testsuite
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation=
          "https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd"
	name="com.baeldung.execution.time.SampleExecutionTimeUnitTest"
	time="15.003" tests="3" errors="0" skipped="0" failures="0">
	<testcase name="someEndToEndTest"
		classname="com.baeldung.execution.time.SampleExecutionTimeUnitTest"
		time="9.996" />
	<testcase name="someIntegrationTest"
		classname="com.baeldung.execution.time.SampleExecutionTimeUnitTest"
		time="5.003" />
	<testcase name="someUnitTest"
		classname="com.baeldung.execution.time.SampleExecutionTimeUnitTest"
		time="0.002" />
</testsuite>

Хотя текстовый формат более удобен для чтения, формат XML является машиночитаемым и может быть импортирован для визуализации в HTML и другие инструменты.

3.3. Отчеты Surefire HTML

Мы можем просмотреть наш тестовый отчет в HTML в нашем браузере с помощью плагина maven-surefire-report-plugin:

<reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-report-plugin</artifactId>
            <version>3.0.0-M3</version>
        </plugin>
    </plugins>
</reporting>

Теперь мы можем выполнить команды mvn для создания отчета:

  1. mvn surefire-report:report – executes the tests and generates an HTML report
  2. mvn site – adds CSS styling to the HTML generated in the last step

Этот отчет показывает время выполнения всех тестовых случаев в классе или пакете, а также время, затраченное на каждый тестовый пример.

4. Результаты теста Jenkins

Если мы запускаем CI в Jenkins, мы можем импортировать файлы XML, написанные surefire. Это позволяет Jenkins помечать сборку как неудачную, если тесты не пройдены, и показывать нам тенденции и результаты тестов.

Когда мы просматриваем результаты тестов в Jenkins, мы также видим время выполнения.

«В нашем примере после установки Jenkins мы настроим задание, используя Maven и файлы отчетов surefire XML, для публикации результатов теста:

Мы добавили в задание действие после сборки для публикации результатов теста. Теперь Jenkins будет импортировать XML-файлы по указанному пути и добавит этот отчет в сводку о выполнении сборки:

Этого также можно добиться с помощью конвейерных сборок Jenkins.

5. Заключение

В этой статье мы обсудили различные способы определения времени выполнения тестов JUnit. Самый непосредственный способ — использовать JUnit runner нашей IDE.

Затем мы использовали maven-surefire-plugin для архивирования отчетов о тестировании в текстовом формате, формате XML и HTML.

Наконец, мы отправили наш тестовый отчет на наш CI-сервер, который может помочь нам проанализировать, как выполняются различные сборки.

Как всегда, пример кода из этой статьи доступен на GitHub.