Java Cucumber:如何从单个场景中的所有步骤中获取字符串参数值

时间:2017-07-10 03:35:29

标签: cucumber gherkin cucumber-java feature-file

我正在寻找一种方法来获取在我的要素文件中为每个方案输入实际方案 之前在每个步骤 中传递的所有参数

示例要素文件:

Feature: Login action
  Background:
    When "{login url}" is open

  Scenario: Registered user provides valid username and password
    Given user enters username "{username}" and password "test password"
    And user clicks on "btnLogin"
    Then user is logged in

我想要的参数:

  • {login url}
  • {username}
  • 密码
  • btnLogin

    到目前为止我尝试了什么:

    我尝试过使用一个会被我的所有场景自动使用的公共钩子:

    public class ScenarioHook {
    
        public ScenarioHook() {
        }
    
        @Before
        public void setupScenario(Scenario scenario) throws InterruptedException {
        //Here I am currently watching the {scenario} object and I can see all the steps
        //but I still dont know where to get the passed parameter values.
        }
    
        @After
        public void teardownScenario() throws InterruptedException {
        }
    }
    

    更新1: 我想这样做的原因是我想操纵字符串(如果可能的话)。例如所有数据都包含在" {}"在进入实际场景之前,它将转换为其他内容。

  • 2 个答案:

    答案 0 :(得分:5)

    您可以使用@Transform注释将参数值更改为步骤定义。

    为此,您需要创建一个包含字符串修改逻辑的类,并返回修改后的值。

    public class StringTransformer extends Transformer<String>{
    
        public String transform(String value) {     
            return "transformed "+value;
        }    
    }
    

    接下来,您需要使用方法参数前面的@Transform注释在stepdefinition中包含此类。

       @When("^Login with (.*?)$")
            public void helloHere(@Transform(StringTransformer.class) String userName)
        {
                System.out.println("TEXT --- " + userName);
        }
    

    这应该为您提供新的转换字符串。您可以使用它从初始字符串创建对象。 (实际上就是它的用途)

    答案 1 :(得分:0)

    黄瓜Sceanario类不会为您提供此信息,因为我认为在开始执行方案之前实际上正在加载和解析所有步骤,但在方案执行期间逐个解析。我能想到的一个选项是创建一个后台步骤,您将手动包含场景中涉及的所有参数。例如:

    Feature: Login action
    
      Background:
        Given these parameters are using within this scenario: "{login url}", "{username}", "password", "btnLogin"
    
        When "{login url}" is open