【问题标题】:How to pass variable values between steps in Cucumber Java?如何在 Cucumber Java 中的步骤之间传递变量值?
【发布时间】:2015-12-24 08:56:29
【问题描述】:

我有一个变量,我想在所有步骤中传递这个变量。 任何人都可以通过代码 sn-p 示例建议如何在步骤之间传递变量值。 任何帮助将不胜感激。

【问题讨论】:

    标签: cucumber cucumber-jvm cucumber-junit meteor-cucumber


    【解决方案1】:

    在 Cucumber for Java (cucumber-jvm) 中,在步骤之间共享数据的预期方式是使用依赖项集成 (DI) 容器 - 其中一些容器已与 Cucumber 集成。

    使用 DI 的方法因容器而异,但这里有一个使用 PicoContainer 的示例:

    // MySharedData.java
    public class MySharedData {
        public String stringData;
    }
    
    // SomeStepDefs.java
    public class SomeStepDefs {
        private MySharedData sharedData;
    
        public SomeStepDefs(MySharedData sharedData) {
            this.sharedData = sharedData;
        }
    
        // StepDefs omitted
    }
    
    // MoreStepDefs.java
    public class MoreStepDefs {
        private MySharedData sharedData;
    
        public MoreStepDefs(MySharedData sharedData) {
            this.sharedData = sharedData;
        }
    
        // StepDefs omitted
    }
    

    DI 容器将确保为 each 场景创建一个 MySharedData 的单个实例,并将其传递给 every 需要的步骤定义类它。这种方法的好处是 Cucumber 确保场景之间没有共享状态泄漏,因为注入的依赖项是为每个场景重新创建的。

    上面的例子使用了构造函数注入(所以注入的依赖是由构造函数参数指定的)但是其他的DI容器也支持其他的注入机制,比如Spring的@Autowired。

    要让 Cucumber 使用 DI,您需要选择一个(并且只有一个)DI 集成并将其包含在您的类路径(或您的 POM)中。选择是:

    • PicoContainer (cucumber-picocontainer.jar)
    • Guice (cucumber-guice.jar)
    • 焊接 (cucumber-weld.jar)
    • 春天 (cucumber-spring.jar)
    • OpenEJB (cucumber-openejb.jar)

    您还需要安装所选的 DI 容器本身,因为 Cucumber jar 仅提供 Cucumber 和 DI 容器之间的集成。

    【讨论】:

    • 您可以为此使用 Hashmap 吗?甚至是一个包含一个 hashmap 的对象?
    • 只要你选择的DI容器可以管理你选择的类的一个实例,那么可以。
    【解决方案2】:
    private static String myName = null;
    
    @Given("I have a cucumber step")
    public void i_have_a_cucumber_step() throws Throwable {
        myName = "Stackoverflow"
    
    }
    
    @Given("^I have (\\d+) (.*) in my basket$")
    public void i_have_in_my_basket(int number, String veg) throws Throwable {
        System.out.println(myName));
    }
    

    【讨论】:

    • 这种技术很有用,但依赖于变量的范围和可见性。而且它可能允许状态在场景之间泄漏,这将是一件坏事。
    • 正如@SebRose 所说,上面的示例看起来不错,直到您发现另一个功能文件使用来自一个Java 类的Given,然后在另一个Java 类中使用Then,现在您想要的信息需要从给定到当时。 Cucumber 是一种不同于其他 BDD 的野兽。将 Given 放在一个单独的类中,将 When 放在一个单独的类中,将 Then 放在一个单独的类中,确实会影响您使用某种策略在它们之间共享信息(世界模式,依赖注入,...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多