#maven #groovy #spock #maven-surefire-plugin #gmavenplus
#java #maven #junit #spock #maven-surefire-plugin
Вопрос:
Env
- java
$ java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
- maven
$ mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: C:Program FilesJetBrainsIntelliJ IDEA 2019.2.3pluginsmavenlibmaven3
Java version: 1.8.0_231, vendor: Oracle Corporation, runtime: C:Program FilesJavajdk1.8.0_231jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
- pom.xml — Разветвленный из spockframework/spock-example
Проблема
Я разветвил spockframework / spock-example, добавив каталог тестов Java и HelloJUnitTest.java => sunzy/spock-exmaple
Тесты Spock могут выполняться, но тесты JUnit не могут
Снимки
- mvn чистый тест
только тесты spock!
- mvn clean test -Dtest= HelloJUnitTest
- Тест JUnit был сгенерирован в целевых / тестовых классах*
- mvn clean test -Dtest= HelloSpocSpec
- mvn -X включает тестовый класс
Комментарии:
1. Переместите свой модульный тест в пакет, а не в
default
тот..2. @khmarbaise Я создал пакет в test / java и перенес в него тест, получил тот же результат
3. Конечно, Surefire / Failsafe может выполнять тесты Spock и JUnit вместе, если они правильно настроены и ваш макет каталога соответствует стандарту Maven. Вы опубликовали впечатляющий объем информации, просто не относящейся к делу: макет исходного каталога тестирования и конфигурацию плагина Maven. Хотя интересно увидеть результат в вашей ситуации, ввод, создающий этот результат, был бы более интересным. Прежде чем я рассмотрю ваш проект на GitHub, один вопрос: насколько вы опытны в Maven? Я хочу соответствующим образом скорректировать свой ответ.
Ответ №1:
Хорошо, я взглянул на ваш проект. Как вы сказали, это всего лишь пример проекта Spock, обновленный для запуска тестов Spock 2. Кстати, его все равно следует обновить, потому что в текущей конфигурации компиляция не работает с текущими версиями Java, но это не по теме, я просто упоминаю об этом, потому что я столкнулся с проблемой, а затем понизил рейтинг до Java 8, чтобы быстро воспроизвести вашу реальную проблему.Имя пакета теста JUnit также не является проблемой, хотя пакет по умолчанию всегда уродлив, как и для тестов Spock.
Spock 1.x основан на JUnit 4, но Spock 2.x основан на платформе JUnit 5. Это также тот, который автоматически обнаруживается Surefire при анализе зависимостей проекта. Если вы хотите, чтобы Surefire запускал несколько движков параллельно, вам необходимо настроить соответствующих поставщиков в качестве зависимостей плагинов, как указано здесь.
В вашем случае просто добавьте это в POM:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M4</version>
<configuration>
<useFile>false</useFile>
<includes>
<include>**/*Test.java</include>
<include>**/*Spec.java</include>
</includes>
</configuration>
<!-- Run Spock 2 and JUnit 4 tests in parallel -->
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>3.0.0-M4</version>
</dependency>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit-platform</artifactId>
<version>3.0.0-M4</version>
</dependency>
</dependencies>
</plugin>
Также имеет смысл явно добавить зависимость от тестовой области в JUnit 4.12 или 4.13 в ваш POM, потому что JUnit 4.12 является только переходной зависимостью в вашем текущем POM. Но более поздние версии Spock 2 могут удалить эту зависимость, потому что она на самом деле не нужна. Я думаю, что это уже произошло с 2.0-M3. Так что будьте осторожны.
После этого изменения Maven говорит:
[INFO] --- maven-surefire-plugin:3.0.0-M4:test (default-test) @ spock-example ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running HelloJUnitTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.059 s - in HelloJUnitTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running DatabaseDrivenSpec
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.171 s - in DatabaseDrivenSpec
(...)
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 39, Failures: 0, Errors: 0, Skipped: 0
Если вы решите перейти с JUnit 4 на 5, возможно, настройка упростится для вас, потому что тогда и Spock, и JUnit используют одного и того же поставщика. В этом случае, пожалуйста, добавьте зависимость JUnit 5, чтобы ваши тесты могли импортировать соответствующие аннотации тестов и методы утверждения.
Обновление: После того, как @khmarbaise прокомментировал использование vintage engine и я полностью согласился с тем, что это лучшее решение, я хочу показать вам, как это сделать, вместо добавления зависимостей плагинов в Surefire. (Так что вы можете удалить их, если хотите использовать это решение):
<dependency> <!-- only required if you want to run JUnit 4 tests alongside Spock 2 -->
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
Почему версия 5.5.2, а не, например, 5.6.2? Чтобы избежать конфликтов версий и последующих предупреждений о том, что vintage engine не находит тесты в каталоге Groovy. Это просто потому, что POM в этом примере проекта все еще использует спецификацию Spock 2.0-M1. Как я уже сказал, его следует обновить. Но с этой версией это работает только потому, что зависит от той же версии платформы JUnit 5, что и Spock в этой конфигурации.
Кстати, теперь Maven сначала выполняет тесты Spock, а затем тесты JUnit 4, поэтому вывод журнала для обоих будет в обратном порядке.
Комментарии:
1. Я бы посоветовал вместо этого лучше использовать junit-jupiter-vintage и удалить зависимости поставщика maven-surefire-plugin. И перейдите только через JUnit Jupiter…
2. Вы правы, Карл Хайнц. Конечно, это было бы предпочтительнее, а также чище, чувствуя себя менее взломанным. Мое решение было слишком быстрым и слишком грязным, я просто возился с ним около двух минут. или около того. Я все еще новичок в Jupiter.
3. У меня было всего несколько минут, чтобы обновить ответ, касающийся движка JUnit 5 vintage. Еще раз спасибо, @khmarbaise.
4. Большое спасибо! surefire-junit47 и surefire-junit-platform не работают, но junit-vintage-engine работает
5. Если первое решение не работает, вы допустили ошибку или изменили что-то еще. Я клонировал ваш проект непосредственно с GitHub и запустил тесты там. Оба решения работают.