Как запускать модульные тесты (не огуречные) и тесты Cucumber (на основе Junit5) отдельно с помощью maven в проекте Spring Boot 3?

Проблема: при использовании более новой версии 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>

Где вы используете cucumber.features?

M.P. Korstanje 20.02.2024 19:32

Ваш люкс также назван неправильно. Чтобы быть признанным Failsafe, необходимо CucumberIT. maven.apache.org/surefire/maven-failsafe-plugin/examples/…

M.P. Korstanje 20.02.2024 19:38

Таким образом, предположительно неправильное имя класса приводит к тому, что тесты не выполняются на этапе проверки. Но затем использование cucumber.features приводит к их выполнению в любом случае, поскольку Cucumber игнорирует надежность и отказоустойчивость. Поэтому вам следует исправить имя класса и заменить свойство cucumber.features эквивалентной аннотацией @Select* из JUnit.

M.P. Korstanje 20.02.2024 19:43

Спасибо, что нашли время посмотреть на это! - Файл называется CucumberIT, это была опечатка в вопросе, я обновил вопрос - огурец. функции находятся в junit-platform.properties.

Thnxalot 21.02.2024 09:50

Я попробовал пример, который вы привели здесь, stackoverflow.com/questions/64676559/… Итак, это будет @SelectClasspathResource("src/integration-test/resources/fea‌​tures"), но я получаю "TestEngine with ID" junit-platform-suite' не удалось обнаружить тесты» без огурца-junit-platform-engine в качестве зависимости. Никаких изменений при использовании огурца-junit-платформенного движка, просто выполняются все тесты, включая. модульные тесты в mvn test

Thnxalot 21.02.2024 09:59

Уберите cucumber.features. Предполагая, что вы правильно настроили Maven, в вашем пути к классам находится только путь после src/integration-test/resources. Поэтому вместо этого вам следует использовать @SelectClasspathResource("features").

M.P. Korstanje 21.02.2024 11:45

Для подтверждения: я удалил строку огурца.features и добавил @SelectClasspathResource("features") в Cucumber IT. Это действительно подхватывает интеграционные тесты при проверке, но, к сожалению, запускает их дважды! Запись показывает: failsafe:3.1.2:integration-test (default) @ projectname --- [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvide‌​r --- [INFO] Running com.project.integration.CucumberIT ->Cucumber tests run И сразу после того же снова: [INFO] --- failsafe:3.1.2:integration-test (integration-tests) @projectname etc

Thnxalot 21.02.2024 14:23

Я добавил конфигурацию Surefire/Failsafe. Без движка огурца-юнит-платформы в отказобезопасном режиме я все равно получаю CucumberIT » NoTestsDiscovered Suite [com.package..CucumberIT] did not discover any tests сбой.

Thnxalot 21.02.2024 14:33

Похоже, у вас довольно сложный проект. Вы можете начать с меньшего проекта, чтобы устранить некоторый шум. Для начала вы можете использовать github.com/cucumber/cucumber-java-skeleton. Посмотрите, сможете ли вы сначала заставить эту работу работать с отказоустойчивостью.

M.P. Korstanje 21.02.2024 15:37

Спасибо, ваши комментарии в конце концов привели меня к решению! :)

Thnxalot 21.02.2024 18:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
10
316
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот что я в итоге делаю:

Чтобы решить проблему, когда 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 в первую очередь? Возможно, предупреждение можно улучшить.

M.P. Korstanje 21.02.2024 19:09

Именно так наш тестер выполнил настройку после обновления Cucumber. Я спросил его, но он не сохранил источники, которыми пользовался. Я видел несколько руководств с использованием такого типа огурца.функция. Я знал, что нам нужно использовать огурец-junit-platform-engine для обнаружения интеграционных тестов, но я не знал, что конфигурация CucumberIT неверна (потому что интеграционные тесты выполнялись, но не в нужном месте). Я просматривал github.com/cucumber/cucumber-jvm/tree/main/…, но это не помогло. Я передам репозиторий скелета нашему тестировщику :)

Thnxalot 22.02.2024 09:51

Ах, обновление, это бы объяснило это. Я думаю, они сопоставили все значения @CucumberOptions.

M.P. Korstanje 22.02.2024 11:48

Другие вопросы по теме