Maven пакет / установить без теста (пропустить тесты)


343

Я пытаюсь упаковать свой проект. Но он автоматически запускает тесты, предшествующие выполнению упаковки. Тесты вставляют некоторый контент в базу данных. Это не то, что я хочу, мне нужно избегать запуска тестов во время упаковки приложения. Кто-нибудь знает, как запустить пакет без теста?


13
Юнит-тест должен состоять из следующих 4 этапов: инициализация, тестирование, проверка и разборка. Возможно, вам следует скорректировать свои тесты и добавить соответствующую разборку / очистку вашей базы данных, или вы должны использовать отдельный экземпляр базы данных, не упакованный с вашим JAR-файлом, для запуска ваших тестов.
Марк-Кристиан Шульце,

Кажется, что ваши тесты "тяжелые", поэтому вы не хотите их выполнять. Но это плохая практика. Может быть, какие-то фреймворки как DBUnit могут вам помочь? Или вы можете отменить изменения базы данных в конце теста?
Микаэль Маррач

Ответы:


575

Запустить мавен с

mvn package -Dmaven.test.skip=true 

1
спасибо за ваш немедленный ответ, я бегу из затмения, где я добавляю команду -Dmaven.test.skip = true?
vks

10
Я никогда не запускал mvn из eclipse, но в окне Run Configuration, где вы настраиваете цели и профили maven, есть флажок «Skip Test». Может быть, это поможет.
Гиоргос Димцас

9
согласно документации, которая будет пропускать компиляцию так же как выполнение. Вы можете использовать -DskipTests, чтобы просто пропустить выполнение. В этом посте также даются некоторые предупреждения о том, с какими версиями вы можете использовать каждый флаг
JonnyRaa

1
Большое спасибо, я делал это с помощью, -DskipTestsно он больше не работает, есть идеи, почему?
Сэм

7
Обратите внимание, что документация Maven Surefire Plugin и Maven Failsafe Plugin предполагает, что настройка skipTestsпредпочтительнее настройки maven.test.skip.
Филипп Бартек

173

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

mvn package -DskipTests

4
для меня это не сработает. Вместо этого мне пришлось использовать принятое решение
Sebas

1
-DskipTestsне работал для меня, когда я использовалmvn clean install -DskipTests
Вишрант

1
Это частично нормально, так как он не будет выполнять тест, НО он будет составлять тестовые классы .....
Antoniossss

Для фолловеров -DskipTestsто же самое, что и -Dmaven.test.skip.exec=true stackoverflow.com/a/21933970/32453, и да, он компилирует тесты и не запускает их (тогда -Dmaven.test.skip=trueкак не компилирует их)
rogerdpack

47

Вы можете добавить эту конфигурацию плагина к вашему pom, если вы не хотите устанавливать в командной строке arg:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <skipTests>true</skipTests>
  </configuration>
</plugin>

3
С этой конфигурацией вы больше не сможете запускать тесты из командной строки.
Эммануэль Бур

1
@EmmanuelBourg Это можно исправить, следуя указаниям в этом примере. Maven.apache.org/plugins/maven-surefire-plugin/examples/…
smp7d

1
исправлена ​​ссылка maven.apache.org/surefire/maven-surefire-plugin/examples/…
ulab

41

Обратите внимание, что -Dmaven.test.skip не позволяет Maven создавать артефакт test-jar.

Если вы хотите пропустить тесты, но создать артефакты в соответствии с обычным использованием сборки:

-Dmaven.test.skip.exec

1
Это был ответ, который я искал, работает просто отлично. Спасибо.
Бинита Бхарати,

Как, черт возьми, я должен помнить это? Почему бы не сделать простой очевидный и запоминающийся псевдоним типа «skipTests»?
TheRealChx101

33

Если вы попробуете это в Windows Powershell, вы получите эту ошибку:

[ERROR] Unknown lifecycle phase ".test.skip=true". You must specify a valid lifecycle phase or a goal in the format...

Причина этого в том, что в Powershell « -» имеет особое значение и вызывает проблемы с maven.

Решение состоит в том, чтобы добавить к нему обратную черту (`), например, так:

mvn `-Dmaven.test.skip=true install 

Ссылка: http://kuniganotas.wordpress.com/2011/08/12/invalid-task-test-skiptrue-you-must-specify-a-valid-lifecycle-phase/


1
У меня была та же проблема, и это решило ее для меня. Спасибо.
nsof


18

Вы можете передать maven.test.skipфлаг в качестве аргумента JVM, чтобы пропустить выполнение тестов при запуске фазы пакета (и предыдущих в жизненном цикле по умолчанию):

mvn package -Dmaven.test.skip=true

Вы также можете передать только skipTestsфлаг исполняемому файлу mvn. Если вы хотите включить эту информацию в своем POM, вы можете создать новый профиль , в котором можно настроить , maven-surefire-pluginчтобы пропустить тесты .




11

Отвечая на старый и принятый вопрос здесь. Вы можете добавить это в свой файл pom.xml, если хотите все время избегать передачи аргумента командной строки:

  <properties>
    <skipTests>true</skipTests>
  </properties>

11

Вы можете добавить любую -DskipTestsили -Dmaven.test.skip=trueлюбую mvnкоманду для пропуска тестов. В вашем случае это будет так:

mvn package -DskipTests

ИЛИ

mvn package -Dmaven.test.skip=true


4

Тесты всегда должны [1] выполняться перед пакетом. Если вам нужно отключить тесты, вы делаете что-то не так. Другими словами, вы пытаетесь решить не ту проблему. Выясните, в чем ваша проблема, и задайте этот вопрос. Похоже, это связано с базой данных.

[1] Вы можете пропустить тесты, когда вам нужно быстро сгенерировать артефакт для локального использования, но в целом создание артефакта всегда должно следовать за успешным выполнением теста.


У меня похожая проблема: мои приложения содержат websocket. Когда я запускаю mvn clean install, я попадаю в бесконечную серию тестов. Прежде чем я принудительно закрыл его, процесс продолжался в течение 3 часов, и напечатанные сообщения были только о Websocket. Можете ли вы проверить мою проблему, чтобы увидеть, что я делаю не так? stackoverflow.com/questions/54614739/…
georgeB

Правила всегда имеют исключения. Если вы так не думаете, вы ошибаетесь.
Джей Салливан


2

Для упаковки maven без заражения тестом maven:

<properties>
    <maven.test.failure.ignore>true</maven.test.failure.ignore>
</properties>

Спасибо, мне нужно было именно это сегодня.
Шон Макмиллан

1

Вы, очевидно, делаете это неправильно. Тестирование является важной частью предварительной упаковки. Вы не должны игнорировать или пропускать это, а делать это правильно. Попробуйте изменить базу данных, в которую он вставляет данные (например, test_db). Это может занять некоторое время, чтобы настроить его. И чтобы эта база данных могла использоваться вечно, вы должны удалить все данные к концу тестов. JUnit4 имеет аннотации, которые облегчают вам задачу. Используйте аннотации @Before, @After @Test для правильных методов. Вам нужно потратить некоторое время на это, но оно того стоит!


9
Я думаю, что вопрос, а также желание упаковывать без запуска тестов является совершенно обоснованным. Я не думаю, что ОП "явно делает это неправильно". Разные люди и проекты имеют разные потребности, и они, как правило, не соответствуют Библии Maven или убеждениям различных людей (таких как вы) о том, как должна работать разработка программного обеспечения. Я думаю, что ваш ответ был бы более ценным без снисходительного подхода.
Ноль3

1

В Intellij перейдите в View -> Tool Windows -> выберите Maven Projects. В раскрывающемся списке «Lifecyle» щелкните правой кнопкой мыши пакет -> выберите «Создать свой проект [пакет]» ...

Введите это значение: package -Dmaven.test.skip=true -f pom.xmlв поле Командная строка. Нажмите «Применить», и должно появиться выпадающее меню «Запустить конфигурации» вместе с созданной вами пользовательской командой maven.


почему это было отвергнуто? Я использую это каждый раз, когда хочу создать свой проект, но пропускаю тесты
Патрик Толентино,



-1

Лучший и самый простой способ сделать это - в IntelliJ Idea в окне «Проект Maven», и просто не нажимать кнопку «Тест». Надеюсь, я тебе помог. Хорошего дня :)


1
Если вы нажмете «пакет», он запустит тесты, которых ОП пытается избежать
Чарли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.