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

How to create a step definition to handle dynamic data entry?

我对此进行了一些搜索,但找不到确切的示例。我有一个表格要填写作为一个步骤。表单字段看起来像这样:

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

但并非所有字段都需要用户输入数据。而不是像这样写几个方法来解释不同的组合:

(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 |  

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

我找到了具有此数据的网站 table-驱动示例:

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         |

但这不是我所追求的。我不需要遍历预先确定的示例数据列表。我希望我已经足够清楚地总结了问题,并且有人知道可以找到此类实施示例的好地方。感谢您的任何建议!

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

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         |

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

或 - 如果您想从 object 列表中的 Whenstep 获取数据,该列表具有与日期、货币等对应的实例变量,您可以在步骤定义中使用 List 参数。这使您免于编写模式表达式。然后你的步骤变成

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

确保您的实例变量名称与您创建的 object 中的 table 标题匹配。

是的,您可以使用数据 table 作为单个非重复步骤的参数。第一行数据table必须是表头:

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;
            // ...
        }
    }
}

您还可以通过声明参数将 table 作为 DataTableList 值对象、List<List<String>>List<Map<String>>与那种类型。 Map<String, String> 在这里似乎最简单。

我这样写示例是因为我假设您需要编写不同的代码来将每个值放入其字段中。如果每个字段的代码都相同,您可以将字段的 CSS 选择器放在数据 table 中,然后去掉开关。

更多例子是here and here.