问题描述
我不了解 Cucumber 配置,也找不到任何示例。
文件夹结构:
src/
|-test/
|-resources/
| |-cucumber/
| |-auth/
| | |-Login.feature
| |-contributions/
| |-ClearanceCertificates.feature
|-java/
|-de/
|-vbg/
|-other/
|-again/
|-important/
|-cucumber/
| |-auth/
| | |-LoginStepDefinitions.java
| |-contributions/
| |-ClearanceCertificatesStepDefinitions.java
|-CucumberBase.java
|-SeleniumApplicationTests.java
CucumberBase.java:
@RunWith(Cucumber.class)
@CucumberOptions(
features = "src/test/resources",plugin = {"pretty","html:build/reports/tests/test/cucumber.html"})
public class CucumberBase {}
SeleniumApplicationTests.java:
@CucumberContextConfiguration
@SpringBootTest
class SeleniumApplicationTests {}
*StepDefinitions.java
都定义了 @Before
和 @After
。我的假设是 StepDefinitions
与基于位置/包的 *feature
文件匹配。
不过在我的测试中,Login.feature
执行 @After
中定义的 ClearanceCertificatesStepDefinitions.java
。
应该如何正确配置?
解决方法
胶水路径上的所有步骤定义和钩子都是全局的。因此所有场景都可以访问胶水路径上的所有步骤定义,并且胶水路径上的所有钩子都在每个场景之前/之后执行。
如果您有只应在特定场景中执行的钩子,您可以使用条件钩子。要仅针对特定场景运行特定挂钩,您可以将 Before 或 After 挂钩与标签表达式相关联。
Feature: Example
@browser
Scenario: Open a browser window
...
@headless
Scenario: Make a http call
...
@After("@browser and not @headless")
public void doSomethingAfter(Scenario scenario){
// only executed after "Open a browser window"
}
https://cucumber.io/docs/cucumber/api/#conditional-hooks
或者,您可以更改代码的组织。
|- src/test/java/com/example/one/RunCucumberTest1.java
|- src/test/resources/com/example/one/example-1.feature
|- src/test/java/com/example/two/RunCucumberTest2.java
|- src/test/resources/com/example/two/example-2.feature
|- src/test/java/com/example/common/AbstractCucumberTest.java
|- src/test/java/com/example/common/SeleniumApplicationTests.java
@RunWith(Cucumber.class)
@CucumberOptions(extraGlue = "com.example.common")
public abstract class AbstractCucumberTest {}
public class RunCucumberTest1 extends AbstractCucumberTest {}
public class RunCucumberTest2 extends AbstractCucumberTest {}
Cucumber 将扫描流道的包装以查找胶水和特征,因此可以省略胶水和特征路径。通过设置 extraGlue
属性,不必复制通用配置。