如何创建步骤定义来处理动态数据输入?

时间:2016-08-25 15:14:40

标签: java webdriver cucumber cucumber-jvm gherkin

我为此搜索了一下,但找不到确切的例子。我有一个表格作为一个步骤填写。表单字段如下所示:

日期:
货币:
总计:
说明:

但并非所有字段都需要用户输入数据。而不是写几种方法来解释不同的组合,如下所示:

(When I enter the 'Date' and 'Currency' and 'Total' and 'Description')  
(When I enter the 'Date' and 'Total')  
(When I enter the 'Currency' and 'Description')  
etc...

我想以某种方式在功能文件中实现类似的东西:

When I enter the following details:  
  |Date        |x    |       
  |Currency    |USD  |  
  |Total       |100  |   
  |Description |Test |  

然后有一个方法来处理用户在第二列中输入的任何数据组合。

我发现网站有这个数据表驱动的示例:

When I enter the following details:  
  |Date        |<date>        |       
  |Currency    |<currency>    |  
  |Total       |<total>       |   
  |Description |<description> |  

Example data:
  |date |currency |total |description |  
  |x    |USD      |100   |foo         |
  |y    |EUR      |200   |test        |
  |z    |HKD      |124   |bar         |

但这不是我所追求的。我不需要遍历预定示例数据的列表。我希望我已经清楚地总结了这个问题,并且有人知道一个好的地方去寻找这种实现的例子。谢谢你的建议!

2 个答案:

答案 0 :(得分:1)

是的,您可以将数据表用作单个非重复步骤的参数。数据表的第一行必须是标题:

When I enter the following details:
  |Name        |Value|
  |Date        |x    |
  |Currency    |USD  |
  |Total       |100  |
  |Description |Test |

这是在一个步骤中使用它的一种可能方式:

@Given("^I enter the following details:$")
public void i_enter_the_following_details(Map<String, String> details) throws Throwable {
    for Map.Entry<String, String> entry : details.entrySet() {
        String key = entry.getKey();
        String value = entry.getValue();
        switch (key) {
            case "Date":
                // add the date to the form
                break;
            // ...
        }
    }
}

您还可以通过声明具有该类型的参数,将该表格作为DataTableList值对象,List<List<String>>List<Map<String>>Map<String, String>似乎最简单。

我用这种方式编写了这个例子,因为我假设您需要编写不同的代码来将每个值放在其字段中。如果每个字段的代码相同,您可以将字段的CSS选择器放在数据表中并摆脱切换。

更多示例包括herehere

答案 1 :(得分:0)

我能理解的是,您正在尝试对表单中的这4个字段进行组合测试。如果是这样那么你需要查看ScenaioOutline选项,我认为你指的是你所谓的数据表驱动。这将允许您提供所有组合作为示例。每个示例都将被选取并作为单独的场景运行。你可以修改你的时间 -

Scenaio Outline:
...
...
When I enter the following details : Date <date> Currency <currency>.......
...
...
Examples:
  |date |currency |total |description |  
  |x    |USD      |100   |foo         |
  |y    |EUR      |200   |test        |
  |z    |HKD      |124   |bar         |

如果将示例表中的任何数据留空,则空白将发送到When步骤。

OR - 如果要从具有与日期,货币等对应的实例变量的对象列表中获取Whenstep中的数据,可以在步骤定义中使用List参数。这样可以避免编写模式表达式。然后你的步骤变为

When I enter the following details : 
date   | currency   | .......
<date> | <currency> | .......

确保实例变量名称与您创建的对象中的表格标题相匹配。