Перейти к основному содержимому

Определите время выполнения тестов JUnit

· 5 мин. чтения

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 с помощью конфигураций запуска/отладки . Как только мы выполняем тесты, бегун показывает статус теста вместе со временем выполнения:

./576a5f968ef770e8d8d0fdd6dd6f17ee.jpg

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

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

2.2. Затмение JUnit Runner

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

./0cd8b583debc6adadee26db44e74f594.jpg

Но, в отличие от средства запуска тестов 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.foreach.execution.time.SampleExecutionTimeUnitTest
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 15.003 s
- in com.foreach.execution.time.SampleExecutionTimeUnitTest

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

3.2. Отчеты об испытаниях Surefire

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

----------------------------------------------
Test set: com.foreach.execution.time.SampleExecutionTimeUnitTest
----------------------------------------------
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 15.003 s
- in com.foreach.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.foreach.execution.time.SampleExecutionTimeUnitTest"
time="15.003" tests="3" errors="0" skipped="0" failures="0">
<testcase name="someEndToEndTest"
classname="com.foreach.execution.time.SampleExecutionTimeUnitTest"
time="9.996" />
<testcase name="someIntegrationTest"
classname="com.foreach.execution.time.SampleExecutionTimeUnitTest"
time="5.003" />
<testcase name="someUnitTest"
classname="com.foreach.execution.time.SampleExecutionTimeUnitTest"
time="0.002" />
</testsuite>

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

3.3. HTML-отчеты Surefire

Мы можем просмотреть наш тестовый отчет в 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 — выполняет тесты и создает отчет в формате HTML.
  2. mvn site — добавляет стили CSS к HTML, сгенерированному на последнем шаге.

./b0f342b93e64eeff7fb26e0aa6d0cc44.jpg

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

4. Результаты теста Дженкинса

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

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

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

./425d6d05420c80b65a86b0af65fb6ef9.jpg

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

./d84a54a9f5ba641f5ab41bc36d570567.jpg

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

5. Вывод

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

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

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

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