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

JavaCucumber:如何从单个场景中的所有步骤中获取字符串参数值,cucumber,gherkin,cucumber-java,feature-file,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 "tes

我正在寻找一种方法,在为我的功能文件中的每个场景输入实际场景之前,获取每个步骤中传递的所有参数

示例功能文件:

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
我要获取的参数:
  • {登录url}
  • {username}
  • 密码
  • btnLogin

    到目前为止我所尝试的:

    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
    
    我已经尝试使用一个公共钩子,它将被我的所有场景自动使用:

    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:
    我想这样做的原因是我想操纵字符串(如果可能的话)。e、 g.“{}”中包含的所有数据将在进入实际场景之前转换为其他数据。

    Cucumber
    Sceanario
    类不会向您提供此信息,因为我认为在开始执行场景之前不会加载和解析所有步骤,而是在场景执行期间逐个解析。我可以想到的一个选择是创建一个后台步骤,在该步骤中,您将手动包含场景中涉及的所有参数。例如:

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

    Cucumber
    Sceanario
    类不会向您提供此信息,因为我认为在开始执行场景之前,并非所有步骤都在加载和解析,而是在场景执行期间逐个解析。我可以想到的一个选择是创建一个后台步骤,在该步骤中,您将手动包含场景中涉及的所有参数。例如:

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

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

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

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

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

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

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

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

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

    你能提供一些你为什么要这样做的信息吗?@EugeneS已经更新了我的问题,提供了我为什么要这样做的基本细节。谢谢你能提供一些你为什么要这样做的信息吗?@EugeneS已经更新了我的问题,提供了我为什么要这样做的基本细节。谢谢谢谢我马上试试这个。如果我发现它有效,我会接受你的答案,但如果你能告诉我是否有一种方法可以做到这一点,而不必在每个参数前面加上@Transform注释,我将不胜感激。再次感谢!您可以尝试使用XStreamConverter注释-,使用xstreams的概念。使用此链接查看如何创建xstream转换器-。您的解决方案有效。我去查一下XStreamConverter。帮个大忙!谢谢你,伙计!谢谢我马上试试这个。如果我发现它有效,我会接受你的答案,但如果你能告诉我是否有一种方法可以做到这一点,而不必在每个参数前面加上@Transform注释,我将不胜感激。再次感谢!您可以尝试使用XStreamConverter注释-,使用xstreams的概念。使用此链接查看如何创建xstream转换器-。您的解决方案有效。我去查一下XStreamConverter。帮个大忙!谢谢你,伙计!