【问题标题】:Execute Cucumber step before/after a specific feature在特定功能之前/之后执行 Cucumber 步骤
【发布时间】:2013-09-17 17:43:18
【问题描述】:

我想为每个特定的功能文件指定某些设置和拆卸步骤。我见过允许代码在每个场景之前执行的钩子,以及在每个功能之前执行代码的钩子,但我想指定代码在所有场景针对一个特定功能运行之前和之后运行一次。

这可能吗?

【问题讨论】:

    标签: java cucumber cucumber-jvm


    【解决方案1】:

    你使用 cucumber-jvm 吗?我找到了一篇符合您要求的文章。

    http://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/

    基本上,不要为此使用 JUnit @BeforeClass 和 @AfterClass,因为它们不知道 Cucumber Hook 标签。您希望 Init 和 Teardown 方法仅在某些场景下运行,对吗?

    【讨论】:

    • cucumber-jvm 比上面的文章解释得更好。
    • 虽然如果你有多个特性文件,那么 Global Hook 可能会有问题
    • 请注意,该链接中的导入已过期。而不是 'cucumber.annotation.{Before/After}' 你应该导入 'cucumber.api.java.{Before/After}'
    【解决方案2】:

    如果您使用 junit 运行测试。我们使用注释来创建一个单元测试类和一个单独的步骤类。标准的@Before 东西放在steps 类中,但@BeforeClass 注解可以在主单元测试类中使用:

    @RunWith(Cucumber.class)
    @Cucumber.Options(format = {"json", "<the report file"},
        features = {"<the feature file>"},
        strict = false,
        glue = {"<package with steps classes"})
    public class SomeTestIT {
        @BeforeClass
        public static void setUp(){
           ...
        }
    
        @AfterClass
        public static void tearDown(){
           ...
        }
    }
    

    【讨论】:

    • 如果我理解正确,为了为每个功能提供特定的设置和拆卸,每个功能都需要它自己的单元测试类吗?这并不理想,但它是一个合理的解决方案。
    • 您可以尝试另一种选择,但我从未使用过,所以不知道它是否有效:将标签添加到您的功能定义中,然后在注释之前使用黄瓜,如 @Before("tagname ”)。这需要一些额外的内务处理,但看起来你不需要每个功能的测试类。
    • 我想到了另一种更简单的方法。只需为设置和拆卸创建场景。可能违背了黄瓜的本意,但是很直接,不需要任何额外的修改
    • 这是一个很好的快速'ndirty 解决方案 :) 官方但我认为并不能保证场景的顺序,我相信你甚至可以让场景并行运行,所以你不能这样做.只是要记住的事情..
    • 我无法运行该类中的任何方法。
    【解决方案3】:

    试试这个:

    在功能文件中:

    @tagToIdentifyThatBeginAfterShouldRunForThisFeatureOnly
    Feature : My new feature ....
    

    在 Stepdefinitions.java 中

    @Before("@tagToIdentifyThatBeginAfterShouldRunForThisFeatureOnly")
    public void testStart() throws Throwable {
    }
    
    @After("@tagToIdentifyThatBeginAfterShouldRunForThisFeatureOnly")
    public void testStart() throws Throwable {
    }
    

    【讨论】:

    • Cucumber 中没有@Begin 注解
    • 它将针对该功能文件中的每个场景运行。
    【解决方案4】:

    嗯,我和你有同样的要求。根据 cucumber-jvm 文档 - Cucumber-JVM does not support running a hook only once.

    所以我对特定变量采用了 null-check 方法,该变量是 @Before 在黄瓜步骤挂钩中的结果。如下所示。

    private String token;
    public String getToken(){
         if (token == null) {
            token = CucumberClass.executeMethod();
          }
    return token;
    }
    

    在上面的示例中,我们假设 getToken() 方法在任何场景运行之前为您提供了一些所需的令牌,并且您只需要一次令牌。这种方法只会在第一次执行您的方法,即在任何场景开始执行之前它为空。它还显着减少了执行时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多