Я работаю с огурцом/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
Обновлено: удалить изображения




Однако в нем не говорится, что «тесты не найдены», изначально была эта проблема и она была решена.
Глядя на ошибку, я подозреваю, что в плагине 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 для каждой среды.
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 эта аннотация работает и не является частью клея :\ Тогда я попробую новый класс для каждой среды.
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.Да, это так.
Во-первых, спасибо за комментарий, как об удалении изображений, так и о «попробуйте это» с новыми вещами, о которых я не думал.