Огурец Junit5 игнорирует аннотацию @Before

Я работаю с огурцом/Java и JUnit4 (CucumberOptions) в течение многих лет без проблем, запуская тесты как в командной строке IntelliJ, так и в maven.


Недавно я пытался перейти на JUnit5, и мне удалось запустить все тесты в IntelliJ (только, к сожалению)

Мой проект POC имеет следующую структуру:

junit5
-Features (folder with feature files)
-resources (folder with files used in tests)
-src
--test
---java
----stepdefs
-----SetupEnvHook
-----StepDefs
----AllTest (testrunner wip)
----JU4Test (testrunner JUnit4)
----JU5Test (testrunner Junit5)
---resources (test resources)
-junit5.iml
-pom.xml

Файл JU5Test.java:

import org.junit.platform.suite.api.ConfigurationParameter;
import org.junit.platform.suite.api.SelectDirectories;
import org.junit.platform.suite.api.Suite;
import stepdefs.SetupEnvHook;
import io.cucumber.java.Before;

import static io.cucumber.core.options.Constants.*;

@Suite
@SelectDirectories("Features")
//@ConfigurationParameter(key = PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME, value = "true")
@ConfigurationParameter(key = PLUGIN_PUBLISH_ENABLED_PROPERTY_NAME, value = "false")
@ConfigurationParameter(key = PLUGIN_PUBLISH_QUIET_PROPERTY_NAME, value = "true")
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "json:target/cucumber-reports/cucumber.json")
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "stepdefs, my.external.steps.stepdefinition")
public class JU5Test {

    @Before
    public static void beforeSuite() {
        SetupEnvHook.setEnvironment("QA");
    }
}

Метод beforeSuite() также используется в JU4Test.

Когда я устанавливаю точку останова в SetupEnvHook.setEnvironment("QA");, она полностью игнорируется из-за того, что аннотация «До» не работает, а другая точка останова внутри того же

@io.cucumber.java.BeforeAll(order = 9999)

Аннотация в классе SetupEnvHook запускается правильно.


Мой файл pom выглядит следующим образом:

 <dependencies>
        <dependency>
            <groupId>my.external</groupId>
            <artifactId>steps</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

Пожалуйста, игнорируйте мою внешнюю зависимость. Эта зависимость связана с stepdefinitions в свойстве клея файла запуска теста.

Я знаю, что значения группы и версии также отсутствуют, но все они поступают из одной и той же зависимости, выделенной красным, чтобы иметь больший контроль над версиями, которые все используют. Все это делается в Java 8 с использованием

org.apache.maven.plugins:maven-compiler-plugin:3.10.1
org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M7
io.cucumber:cucumber-java:7.8.1
io.cucumber:cucumber-junit:7.8.1
io.cucumber:cucumber-junit-platform-engine:7.8.1
org.junit.jupiter:junit-jupiter-api:5.9.1
org.junit.jupiter:junit-jupiter-engine:5.9.1
org.junit.platform:junit-platform-suite-api:1.9.1
org.junit.platform:junit-platform-suite-engine:1.9.1

Я уже пытался использовать разные аннотации не только из io.cucumber.java, но и из org.junit (который в основном представляет собой JUnit4) и org.junit.jupiter.api, но безуспешно.

Запуск через командную строку maven заканчивается:

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project junit5: No tests were executed! 

Однако в нем не говорится, что «тесты не найдены», изначально была эта проблема и она была решена.

Глядя на ошибку, я подозреваю, что чего-то не хватает в плагине pom.xml surefire, но я не могу понять, что именно. (этот pom используется для запуска JU4Test без проблем)

У кого-нибудь еще есть мысли о том, что я могу попробовать дальше? или еще лучше, решение для этого xD

Обновлено: удалить изображения

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

Ответы 1

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

Однако в нем не говорится, что «тесты не найдены», изначально была эта проблема и она была решена.

Глядя на ошибку, я подозреваю, что в плагине pom.xml surefire чего-то не хватает, но я не могу понять, что именно. (этот pom используется для запуска JU4Test без проблем)

По вашему описанию невозможно сказать, что не так с вашим проектом. Ваш список зависимостей включает зависимости, не включенные в ваш POM.

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

Когда я устанавливаю точку останова в SetupEnvHook.setEnvironment("QA"); он полностью игнорируется из-за того, что аннотация «До» не работает

Причина, по которой аннотация @Before игнорируется, заключается в том, что вы используете аннотацию Cucumber для класса, который не является частью связующего пути.

Хотя я подозреваю, что вы пытаетесь найти сопоставление для JUnit 4 @BeforeClass. В настоящее время в JUnit 5s Suite Engine такого нет. Если вам это нужно, вы должны подумать о том, чтобы сделать запрос на включение.

В качестве альтернативы вы можете создать пакет с одним классом для каждой среды и использовать хуки Cucumbers @BeforeAll для установки среды. Затем для каждого @Suite вы настраиваете отдельный путь склейки, чтобы включить эти хуки.

Хотя я думаю, что было бы еще лучше прочитать целевую среду из переменной среды и установить по умолчанию что-то разумное. Затем вы можете использовать разные задания CI для каждой среды.

Во-первых, спасибо за комментарий, как об удалении изображений, так и о «попробуйте это» с новыми вещами, о которых я не думал.

sergiogouveia 03.11.2022 12:25
Your list of depencies includes dependencies not included in your POM. Зависимости включены во «внешний» пакет, это облегчает другим создание своих тестов и шагов, не беспокоясь о том, какие зависимости им нужны. Мы, вероятно, опустим это, чтобы сделать внешний пакет «тоньше». The reason the @Before annotation is ignored is because you are using a Cucumber annotation on a class that is not part of the glue path. В тестировщике Junit4 эта аннотация работает и не является частью клея :\ Тогда я попробую новый класс для каждой среды.
sergiogouveia 03.11.2022 12:33
The reason the @Before annotation is ignored is because you are using a Cucumber annotation on a class that is not part of the glue path. Моя ошибка в вопросе, извините, файлы тестового запуска находятся внутри папки stepdefs, поэтому они являются частью клея. поэтому он работает на JUnit4. Просто чтобы объяснить «ответ», это действительно проблема: Though I suspect you are trying to find a mapping for JUnit 4s @BeforeClass. Currently there is not such thing in JUnit 5s Suite Engine. If you need it, you should consider making a pull requests.
sergiogouveia 03.11.2022 12:43

Да, это так.

M.P. Korstanje 03.11.2022 12:59

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