Avatar ·

Как запустить сборку Gradle без выполнения тестов?

Всем привет! Я новичок в Gradle и Java, и у меня возникла проблема. У меня есть проект, который собирается через Gradle. Когда я запускаю команду `gradle build`, сборка проходит успешно, но она также запускает все модульные тесты. Это нормально для финальной сборки, но во время разработки я часто хочу просто скомпилировать проект и собрать JAR-файл без выполнения тестов, потому что тесты занимают много времени (у нас их около 200, и они выполняются минут 5-7). Я пробовал искать в документации, но там много разных флагов, и я запутался. Вот мой текущий `build.gradle` (упрощённо): ```java plugins { id 'java' id 'application' } repositories { mavenCentral() } dependencies { testImplementation 'junit:junit:4.13.2' } ``` Когда я запускаю `gradle build`, он выполняет все задачи: compileJava, processResources, classes, compileTestJava, processTestResources, testClasses, test, check, build. Мне нужно пропустить шаги, связанные с тестированием (compileTestJava, test, check). Как это сделать? Можно ли как-то временно отключить тесты для одной сборки, не редактируя сам файл build.gradle? Или есть специальный флаг командной строки? Заранее спасибо за помощь! P.S. Версия Gradle 7.2, Java 11. <<>>

Решение: флаг командной строки -x или --exclude-task

Самый простой и правильный способ пропустить тесты при сборке Gradle — использовать флаг -x (или его полную версию --exclude-task). Этот флаг позволяет исключить любую задачу (task) из графа выполнения. В вашем случае нужно исключить задачу test, так как она запускает выполнение тестов и также блокирует выполнение последующих задач check и финальной сборки.

Запустите сборку следующей командой:

gradle build -x test

Или, если вы хотите использовать полный синтаксис:

gradle build --exclude-task test

После этого Gradle выполнит все задачи, кроме test и тех, которые от него зависят (например, check). Ваш JAR-файл будет собран, а тесты — пропущены. Вы увидите в логах что-то вроде:

> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :jar
> Task :startScripts
> Task :distTar
> Task :distZip
> Task :assemble
> Task :build (excluded task: test)

Важные нюансы и дополнительные возможности

  • Исключение нескольких задач: Если вы хотите исключить не только тесты, но и, например, статический анализ кода (lint), можно перечислить несколько флагов: gradle build -x test -x checkstyleMain.
  • Постоянное отключение тестов: Если вы хотите отключить тесты навсегда (например, в CI-сборке, где тесты запускаются отдельной стадией), можно добавить в build.gradle блок test { enabled = false }. Но это не рекомендуется для локальной разработки, так как можно случайно забыть включить тесты обратно.
  • Отключение компиляции тестового кода: Если вы хотите сэкономить ещё больше времени и не компилировать тестовые классы, используйте gradle build -x compileTestJava -x test. Однако обычно компиляция тестов занимает секунды, а выполнение — минуты, поэтому достаточно исключить только test.
  • Использование Gradle Wrapper: Если вы используете ./gradlew (рекомендуется), команда будет выглядеть так: ./gradlew build -x test.

Альтернативный подход: задача assemble

Вы также можете использовать задачу assemble, которая собирает все артефакты (JAR, WAR и т.д.) без запуска тестов и проверок. Это эквивалентно gradle build -x test -x check, но короче:

gradle assemble

Задача assemble включает в себя jar и другие упаковочные задачи, но не включает test и check. Это хороший вариант, если вам нужен только собранный артефакт.

Почему это работает?

Gradle использует ациклический граф зависимостей задач (DAG). Задача build зависит от check и assemble. Задача check зависит от test. Флаг -x test просто удаляет задачу test из графа выполнения, и все зависимости, которые вели к ней, становятся выполненными автоматически (Gradle считает их "выполненными" без фактического запуска).

<<>>

Использование свойства проекта для условного отключения тестов

Если вы хотите иметь возможность гибко включать/отключать тесты через параметры командной строки без изменения build.gradle, можно использовать свойство проекта (project property). Добавьте в ваш build.gradle следующий блок:

test {
    // Отключаем тесты, если передано свойство skipTests
    enabled = !project.hasProperty('skipTests')
}

Теперь вы можете запускать сборку без тестов так:

gradle build -PskipTests

Флаг -P передаёт свойство skipTests в проект. Если свойство присутствует, test.enabled становится false, и тесты не выполняются. Если не передавать -PskipTests, тесты будут выполняться как обычно.

Этот подход удобен, если вы часто переключаетесь между сборками с тестами и без них, и не хотите каждый раз вспоминать флаг -x test. Также его можно комбинировать с CI-системами: например, в Jenkins или GitLab CI можно передавать -PskipTests для быстрых сборок, а для полноценных релизов — не передавать.

Минус: нужно один раз изменить build.gradle. Но это изменение безопасное и не ломает существующие команды.