【问题标题】:Cucumber process / sub process invocation黄瓜进程/子进程调用
【发布时间】:2016-10-04 08:19:03
【问题描述】:

我正在使用 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 不支持它们。这是唯一可用的选项还是有其他选项?理想情况下,我会调用整个场景而不是单个步骤。

【问题讨论】:

  • 那么子流程也是一个独立的场景,可以独立工作?能否不将子流程步骤与流程场景中的数据一起复制?
  • 嘿蚱蜢,是的,子流程可以独立工作,但有多个任务 +10 等,我不想在 2 个地方维护。

标签: java cucumber cucumber-jvm


【解决方案1】:

这可能不是您正在寻找的答案...但我在这些情况下所做的是创建一个“新”步骤,将场景中涉及的所有步骤分组。我知道这不是一个优雅的解决方案,但我认为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

我将等待其他答案,希望有更好的选择。 希望对您有所帮助。

【讨论】:

  • 谢谢 troig,这个问题是子进程实际上是一个场景大纲,需要我想保留在 Gherkin 和 Java 之外的配置。
  • 不客气@IanWatson,你是对的。很遗憾不能参考其他场景......我在我的答案中做了一些修改,使用背景。我认为它更清楚,但无论如何你的问题仍然存在。我也会等待其他答案。
【解决方案2】:

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

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

您也可以让 cucumber 将列中的所有值作为列表返回

但如果这涉及到大量配置数据,您可能希望从 yaml 文件等数据源中读取配置并将密钥传递给该步骤。

yaml 文件:

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

你的步骤只需要一个输入

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

步骤定义解析哈希图并根据需要将值传递给步骤方法。

或者您可以将值作为表格,创建一个类 Configuration 并且步骤定义将列表值作为输入: 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){}

【讨论】:

  • 感谢您的回复Sid,但我认为这不会起作用,子流程是带有数据表的场景。我不明白如何在不定义相同数据表的情况下使用其数据表执行场景。
  • 嗯..Cucumber 不支持在另一个场景中调用场景。您很可能必须传递相同的数据集。我能想到的只有三种方法: 1. 表中的数据存储在像 yaml 这样的数据源中,并且两个 yaml 都使用一个引用它的列表,因此您需要做的就是在两者中调用相同的键,或者2.配置细节直接在步骤定义中处理,而不是功能文件,如果您不想传递表中的配置。 3. 将您的子流程转换为一个步骤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多