java - Cucumber 场景断言 DataTable 中的条件

标签 java cucumber cucumber-jvm

我在 Cucumber-jvm 中有以下场景,想知道编写这个场景的最佳方式是什么。

Given I create a process
When I execute the following tasks with parameters:
|Task Name| param1 | param2| param3|
...
Then each task should have outcomes:
|Task Name| outcome1 | outcome2| outcome3|

解决这个问题的最佳方法是什么?

我需要执行“When Task1”、“Then Task1”,然后执行“When Task2 then Task2”等,因为下一个任务启动时状态信息会丢失。而不是先调用所有 When Task1,2,3,然后再调用 then Task1,2,3。

还会有很多+50的任务,因此将其分成单独的步骤并不理想。

我可以将“何时/然后”合并为一个步骤,但这似乎不对。

有什么建议吗?

最佳答案

如何使用场景大纲。这会将每个任务本身作为一个场景运行。

为了避免重复给定步骤,您可以在步骤定义java中设置一个静态 boolean 变量并将其检查为标志。

Scenario Outline:
Given I create a process
When I execute the following task <TaskName> with parameters:
|<Parameter1>|<Parameter2>|<Parameter3>|
Then each task <TaskName> should have outcomes:
|<Outcome1>|<Outcome2>|<Outcome3>|

Examples:
|TaskName|Parameter1|Parameter2|Parameter3|Outcome1|Outcome2|Outcome3|
|task1|t1param1|t1param2|t1param3|t1out1|t1out2|t1out3|
|task2|t2param1|t2param2|t2param3|t2out1|t2out2|t2out3|
.......

如果参数和结果的数量可变,请使用符号分隔的字符串修改它们。您可以在步骤定义中使用@Transform注释来获取参数或结果的对象。

Scenario Outline:

Given I create a process
When I execute the following task <TaskName> with parameters <parameters>
Then each task <TaskName> should have outcomes <outcomes>

Examples:
| TaskName | Parameters | Outcomes |
| task1 | t1param1,t1param2,t1param3| t1out1,t1out2,t1out3 |
| task2 | t2param1,t2param2,t2param3| t2out1,t2out2,t2out3 |
.......

如果一项任务对另一项任务的结果有任何依赖性,那么您必须小心处理它们。如果任何任务中需要,您甚至可以在当前的“Then”步骤之后添加一个重置步骤,例如终止当前进程等。

<小时/>

最后一个场景 --- 这是一个很大的 hack,依赖于场景 ID 保持不变。 在最后一步的示例表中添加场景计数,如下所示。

Scenario Outline:

    Given I create a process
    When I execute the following task <TaskName> with parameters <parameters>
    Then each task <TaskName> should have outcomes <outcomes>
    ***And Last step to run for last scenario 3***

    Examples:
    | TaskName | Parameters | Outcomes |
    | task1 | t1param1,t1param2,t1param3| t1out1,t1out2,t1out3 |
    | task2 | t2param1,t2param2,t2param3| t2out1,t2out2,t2out3 |
    | task3 | t3param1,t3param2,t3param3| t3out1,t3out2,t3out3 |


Include in StepDefinition.java

private Scenario scenario;

@Before
public void before(Scenario sce) {
    this.scenario = sce;
    System.out.println("SCENARIO ID -- " +scenario.getId());
}

您将得到一个类似于场景大纲的字符串 - **feature-description ;场景大纲-描述;示例描述;行号 + 1**。例如——validating-sample;so1;se1;2。这将用于示例表的第一行。

对于场景大纲案例,您可以使用分隔符“;”进行分割并使用减去 1 后的最后一部分。将此逻辑放入方法 getCurrentExamplesRow()

@Then("^Last step to run for last scenario (\\d+)$")
public void lastStep(int size) {

    // Will be called only for last scenario in examples... 
    if(size==getCurrentExamplesRow()) {

    }
}

关于java - Cucumber 场景断言 DataTable 中的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39831105/

相关文章:

java - 使用 BouncyCaSTLe 轻量级 API 的 AES-256 加密

jquery - cucumber 测试网页的背景颜色

intellij-idea - 配置 IntelliJ 以运行 Groovy Cucumber Geb 框架

java - 从 Vaadin 8 应用程序生成 HTML 页面并在新窗口中打开

java - 如何在 Intellij Idea (2017) 中打开 Collection 夹中选定的文件(所有文件)

java - 遍历所有字节值 -128-127 而无需在 Java 中强制转换

cucumber - 如何让 Cucumber 对 Selenium 和 headless 浏览器运行相同的步骤

java - 参数化 mvn test 命令以更改属性文件中的环境变量

Cucumber/gradle 示例没有生成报告?

java - 如何在 Cucumber for Java 中执行标记驱动的跨浏览器测试?