2016-10-04 39 views
0

我正在使用Cucumber-JVM。黄瓜进程/子进程调用

我有一个进程和一个子进程。该进程调用子进程,然后继续。

理想我想以下情况:

Scenario: Process 
Given I start a process 
When I have completed the sub process 
And then I complete task A 
And then I complete task B 
Then the process is finished 

Scenario: SubProcess 
Given I start a subprocess 
When I complete task C 
And then I complete task D 
Then the process is finished 

我想知道最好的办法是什么编码“当我已经完成了子流程”

我读了一些关于调用步骤但是从步骤定义中,它们在cucumber-jvm中不受支持。这是唯一可用的选择还是有其他的?理想情况下,我会调用整个场景而不是单个步骤。

+0

因此子进程也是一个独立的情况下,可以在工作的拥有?您是否可以不重复子流程步骤以及流程场景中的数据? – Grasshopper

+1

嘿蚱蜢,是的子过程可以自己工作,但有多个任务+10等,我不想在2个地方保持。 – IanWatson

回答

0

也许这不会是您正在寻找的答案......但我在这些情况下所做的是创建一个“新”步骤,将该场景中涉及的所有步骤分组。我知道这不是一个优雅的解决方案,但我认为cucumber-jvm中没有其他选项。看到这个closed issue

举例您的使用情况:

@When("^I have completed the sub process$") 
public void I_have_completed_the_sub_process() throws Throwable { 
I_complete_task_C(); 
I_complete_task_D(); 
the_process_is_finished(); 
} 

然后,您可以使用在given场景背景条件下,这种新的台阶。类似的东西:

Background: 
Given I have completed the sub process 

Scenario: Process 
Given I start a process  
And then I complete task A 
And then I complete task B 
Then the process is finished 

我会等待其他答案,希望有更好的选择。 希望它有帮助。

+1

感谢troig,与此有关的问题是子进程实际上是一个场景大纲,它需要我想保留在Gherkin和Java之外的配置。 – IanWatson

+0

不客气@IWanWatson,你是对的。这是一个耻辱不能参考其他情况...我在我的答案,使用背景做了一点编辑。我认为它更清晰,但你的问题仍然会存在。我还会等待其他答案。 – troig

0

如果我正确理解了这个问题,假设您只想为流程运行一次子流程,那么您要查找的是一张表(或一个场景概要)。

Scenario: Process 

Given I start a process 
When I have completed the sub process "<x>" "<y>" "<z>" 
| x | y | z| 
And then I complete task A 
And then I complete task B 
Then the process is finished 

Scenario Outline: Process 
Given I start a process 
When I have completed the sub process "<x>" "<y>" "<z>" 
And then I complete task A 
And then I complete task B 
Then the process is finished 
| x | y | z| 

Scenario Outline: SubProcess 
Given I start a subprocess "<x>" 
When I complete task C "<y>" 
And then I complete task D "<z>" 
Then the process is finished 
Examples: 
| x | y | z | 

@When("^I have completed the sub process (.*) (.*) (.*)$") 
public void I_have_completed_the_sub_process(String x, String y, String z) throws Throwable { 
    I_start_a_subprocess(x); 
    ..... 
    <your code>; 
} 

你也可以有黄瓜列返回所有值列表

但是,如果这涉及到很多的配置数据,你可能会想读取配置从像yaml文件这样的数据源传递出来,并将密钥传递给该步骤。

YAML文件:

:configuration: 
    :x: "val1" 
    :y: "val2" 
    :z: "val3" 

而且你一步只需一个输入

When I have completed the sub process "<configuration>" 

步骤定义解析HashMap和需要传递值的步骤方法。

或者你可以有值作为一个表,创建一个类配置和步骤定义将列表值输入: https://thomassundberg.wordpress.com/2014/06/30/cucumber-data-tables/

public class Config{ 
private String x, 
private String y, 
Private String z } 

public void step_definition_function(<List>Config config){} 
+0

感谢您的回复Sid,但我不认为这会奏效,子过程是一个数据表的场景。我没有看到我将如何在数据表中执行场景,而无需在过程中定义相同的数据表。 – IanWatson

+0

嗯..铜钱不支持在另一个场景中调用场景。您很可能必须传递相同的数据集。我能想到的只有三种方法:1.表中的数据存储在像yaml这样的数据源中,并且两个yamls都只有一个列表引用它,所以你只需要在两者中调用相同的键2.如果您不想在表中传递配置,配置详细信息将直接在步骤定义中处理,而不是在功能文件中处理。 3.将您的子流程转换为一个步骤。 – Sid

+0

#1可能是一个很好的留言 – IanWatson