黄瓜场景在DataTable中断言条件

时间:2016-10-03 12:01:49

标签: 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,然后执行Task1,然后执行Task2 Then Task2等,因为状态信息在下一个任务启动时丢失。而不是首先调用所有的When Task1,2,3然后是Then Task1,2,3。

还会有很多任务+50因此将它分成不同的步骤并不理想。

我可以将When / Then合并为一步,但这似乎不对。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

为避免重复Given step,您可以在步骤定义java中设置静态布尔变量,并将其作为标志进行检查。

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 annotation来获取参数或结果的对象。

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步骤之后添加重置步骤,例如,终止当前进程等。

最后一个场景---这是一个很大的黑客,取决于场景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 ; scenariooutline-description ; example-description ; rownumber + 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()) {

    }
}

答案 1 :(得分:0)

您的问题是由此步骤引起的

When I execute the following tasks with parameters:
|Task Name| param1 | param2| param3|
...

使用Cucumber这是一种非常糟糕的方式。相反,您应该使用格式

的单个步骤替换此步骤的每个实例
When I xxx

然后您的任务是找到xxx的替换(名称)。这些名称应描述执行所有任务的综合效果。

你所拥有的任务或任务有多少并不重要,你总能找到一个封装整个批次的名字。

现在,您执行新命名任务(HOW)的任务列表可以在堆栈中进一步定义。这可以在步骤定义,步骤定义的辅助方法中,或者在实际代码中更好。

找到这个单一名称的过程称为抽象。它是你每天使用的东西 - 你喝一杯茶,而不是

fill the kettle with 350ml of cold water
switch of the kettle just before its boiled
pour 5ml of water into each cup to warm them
switch on the kettle until its boiled
... 
...
zzzzzz

你在自己的场景中所做的事情就像对某人所说的那样愚蠢而不是make some tea

使用自然语言的Cucumber的全部意义在于允许场景编写者使用自然语言的力量来编写简单而富有表现力的东西。每当你把某些事情的细节都放到一个场景中时,你就无法有效地使用语言。