Проблема: при использовании более новой версии Cucumber и Junit5 с огурцом-junit-платформенным движком mvn test запускает как модульные, так и интеграционные тесты. Мы больше не можем запускать их отдельно, и я ищу способ это исправить.
У нас были модульные тесты, запускающие mvn test, и интеграционные тесты огурца на mvn, проверяющие с помощью плагина Surefire и Failsafe. После обновления до Junit5 и Cucumber 7.15.0 мы теперь используем огуречный-junit-платформенный движок для maven, чтобы обнаружить тесты огурца. Проблема в том, что у нас больше нет возможности запускать эти тесты отдельно. И mvn test, и mvnverify запускают все тесты (модульные тесты и тесты огурца) вместе.
Как мы можем отличить запуск модульных тестов на mvn test от интеграционных тестов огурца на mvnverify?
Структура проекта:
- src
|-integration-test
|-resources with feature files, and application.yml for tests
|-java
|-com.project.package.structure
|- scenariosteps
|- CucumberIT.java with @Suite annotation
|- IntegrationTestConfig with @TestConfiguration annotation
|- SpringEntry.java
|-Spring boot 3 project
|-test
|-java
|-com.project.package.structure
|-our junit5 + mockito unit tests
Зависимости (все зависимости проекта Spring Boot 3 опущены)
Maven surefire plugin 3.2.5
Maven failsafe plugin 3.2.1
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>7.15.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>7.15.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-spring</artifactId>
<version>7.15.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.10.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit-platform-engine</artifactId>
<version>7.15.0</version>
<scope>test</scope>
</dependency>
Я просматривал документы + stackoverflow, чтобы узнать, как это сделать. Когда мы использовали org.apache.maven.surefire.junitplatform.JUnitPlatformProvider, это работало нормально, но похоже, что io.cucumber.junit.platform.engine.DiscoverySelectorResolver переопределяет все:
Я получаю это предупреждение при запуске теста mvn перед выполнением модульных тестов и тестов Cucumber:
io.cucumber.junit.platform.engine.DiscoverySelectorResolver alertWhenCucumberFeaturesPropertyIsUsed ВНИМАНИЕ: Обнаружение тестов с использованием свойства огурца.features. Другие селекторы обнаружения игнорируются! Пожалуйста, попросите/поддержите/спонсируйте/и т. д. лучшую поддержку селекторов обнаружения JUnit 5. См.: https://github.com/cucumber/cucumber-jvm/pull/2498
Когда я удаляю огурец-junit-platform-engine из зависимостей, используется следующее. Но это не соответствует тестам Cucumber. Похоже, переключение обратно на JUnitPlatformProvider невозможно, поскольку оно больше не совместимо с тестами Cucumber.
Использование автоматически обнаруженного поставщика org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
Моя надежная/отказоустойчивая конфигурация:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<skipTests>${unit-tests.skip}</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven-failsafe-plugin.version}</version>
<dependencies>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit-platform-engine</artifactId>
<version>${cucumber.version}</version>
</dependency>
</dependencies>
<configuration>
<properties>
<configurationParameters>
cucumber.junit-platform.naming-strategy=long
</configurationParameters>
</properties>
</configuration>
<executions>
<execution>
<id>integration-tests</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<skipTests>${integration-tests.skip}</skipTests>
<runOrder>alphabetical</runOrder>
<parallel>none</parallel>
</configuration>
</execution>
</executions>
</plugin>
Ваш люкс также назван неправильно. Чтобы быть признанным Failsafe, необходимо CucumberIT. maven.apache.org/surefire/maven-failsafe-plugin/examples/…
Таким образом, предположительно неправильное имя класса приводит к тому, что тесты не выполняются на этапе проверки. Но затем использование cucumber.features приводит к их выполнению в любом случае, поскольку Cucumber игнорирует надежность и отказоустойчивость. Поэтому вам следует исправить имя класса и заменить свойство cucumber.features эквивалентной аннотацией @Select* из JUnit.
Спасибо, что нашли время посмотреть на это! - Файл называется CucumberIT, это была опечатка в вопросе, я обновил вопрос - огурец. функции находятся в junit-platform.properties.
Я попробовал пример, который вы привели здесь, stackoverflow.com/questions/64676559/… Итак, это будет @SelectClasspathResource("src/integration-test/resources/features"), но я получаю "TestEngine with ID" junit-platform-suite' не удалось обнаружить тесты» без огурца-junit-platform-engine в качестве зависимости. Никаких изменений при использовании огурца-junit-платформенного движка, просто выполняются все тесты, включая. модульные тесты в mvn test
Уберите cucumber.features. Предполагая, что вы правильно настроили Maven, в вашем пути к классам находится только путь после src/integration-test/resources. Поэтому вместо этого вам следует использовать @SelectClasspathResource("features").
Для подтверждения: я удалил строку огурца.features и добавил @SelectClasspathResource("features") в Cucumber IT. Это действительно подхватывает интеграционные тесты при проверке, но, к сожалению, запускает их дважды! Запись показывает: failsafe:3.1.2:integration-test (default) @ projectname --- [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider --- [INFO] Running com.project.integration.CucumberIT ->Cucumber tests run И сразу после того же снова: [INFO] --- failsafe:3.1.2:integration-test (integration-tests) @projectname etc
Я добавил конфигурацию Surefire/Failsafe. Без движка огурца-юнит-платформы в отказобезопасном режиме я все равно получаю CucumberIT » NoTestsDiscovered Suite [com.package..CucumberIT] did not discover any tests сбой.
Похоже, у вас довольно сложный проект. Вы можете начать с меньшего проекта, чтобы устранить некоторый шум. Для начала вы можете использовать github.com/cucumber/cucumber-java-skeleton. Посмотрите, сможете ли вы сначала заставить эту работу работать с отказоустойчивостью.
Спасибо, ваши комментарии в конце концов привели меня к решению! :)




Вот что я в итоге делаю:
Чтобы решить проблему, когда mvn test запускал интеграционные тесты как модульного, так и огуречного, и мы получали предупреждение io.cucumber.junit.platform.engine.DiscoverySelectorResolver warnWhenCucumberFeaturesPropertyIsUsed при запуске mvn test/verify, я использовал @M.P. Решение Корстанье:
Удалены огурец.функции из junit-platform.properties. А для CucumberIT.java:
@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("features")
// Worked the same as the line above: @ConfigurationParameter(key = FEATURES_PROPERTY_NAME, value = "src/integration-test/resources/features")
public class CucumberIT {
}
Зависимости:
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>7.15.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>7.15.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-spring</artifactId>
<version>7.15.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit-platform-engine</artifactId>
<version>7.15.0</version>
<scope>test</scope>
</dependency>
Мой верный и надежный вариант:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
<configuration>
<skipTests>${unit-tests.skip}</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<properties>
<configurationParameters>
cucumber.junit-platform.naming-strategy=long
</configurationParameters>
</properties>
</configuration>
<executions>
<execution>
<id>integration-tests</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<skipTests>${integration-tests.skip}</skipTests>
</configuration>
</execution>
</executions>
</plugin>
Последняя проблема заключалась в том, что Failsafe дважды запускал интеграционные тесты, это оказалась старая конфигурация <runOrder>alphabetical</runOrder><parallel>none</parallel> чуть ниже <skipTests>${integration-tests.skip}</skipTests> в плагине Failsafe.
Прохладный! Какова была причина использования cucumber.features в первую очередь? Возможно, предупреждение можно улучшить.
Именно так наш тестер выполнил настройку после обновления Cucumber. Я спросил его, но он не сохранил источники, которыми пользовался. Я видел несколько руководств с использованием такого типа огурца.функция. Я знал, что нам нужно использовать огурец-junit-platform-engine для обнаружения интеграционных тестов, но я не знал, что конфигурация CucumberIT неверна (потому что интеграционные тесты выполнялись, но не в нужном месте). Я просматривал github.com/cucumber/cucumber-jvm/tree/main/…, но это не помогло. Я передам репозиторий скелета нашему тестировщику :)
Ах, обновление, это бы объяснило это. Я думаю, они сопоставили все значения @CucumberOptions.
Где вы используете
cucumber.features?