黄瓜场景断言数据表中的条件
Cucumber scenario assert condition in DataTable
我在 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 的任务,因此将其拆分为单独的步骤并不理想。
我可以将 When/Then 合并为一个步骤,但这似乎不对。
有什么建议吗?
使用场景大纲怎么样。这将 运行 每个任务本身作为一个场景。
为了避免重复 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 步骤之后添加一个重置步骤,例如终止当前进程等。
最后一个场景 --- 这是一个大 hack,依赖于保持不变的场景 id。
在最后一步的示例中添加场景计数 table,如下所示。
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
。这将用于示例的第一行 table.
场景大纲可以用分隔符“;”分割并在减去 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()) {
}
}
你的问题是因为有这一步
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 使用自然语言的全部意义在于允许场景编写者使用自然语言的力量来编写简单而富有表现力的东西。每次您让有关如何完成某事的细节溜进场景中时,您就无法有效地使用语言。
我在 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 的任务,因此将其拆分为单独的步骤并不理想。
我可以将 When/Then 合并为一个步骤,但这似乎不对。
有什么建议吗?
使用场景大纲怎么样。这将 运行 每个任务本身作为一个场景。
为了避免重复 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 步骤之后添加一个重置步骤,例如终止当前进程等。
最后一个场景 --- 这是一个大 hack,依赖于保持不变的场景 id。 在最后一步的示例中添加场景计数 table,如下所示。
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
。这将用于示例的第一行 table.
场景大纲可以用分隔符“;”分割并在减去 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()) {
}
}
你的问题是因为有这一步
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 使用自然语言的全部意义在于允许场景编写者使用自然语言的力量来编写简单而富有表现力的东西。每次您让有关如何完成某事的细节溜进场景中时,您就无法有效地使用语言。