多个@Before/@After 与 Cucumber 和 Spring?

问题描述

我不了解 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 属性,不必复制通用配置。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...