小黄瓜 - 维持场景之间的状态

时间:2016-03-31 13:27:20

标签: javascript cucumber gherkin cucumberjs

虽然我已经编写了20多年的单元测试,但我是Gherkin的新手,并且已经被赋予了为.feature文件实现故事的任务,该文件减少到这样:

Scenario: a
    Given that the app is open
    When I open a certain dialog
    Then it has a thing somewhere

Scenario: b
    Given that the dialog from 'a' is open...

# Imagine here a long chain of scenarios, each depending on the previous

Scenario: n
    Given that the previous 'n' steps have all completed....

即,一长串长的场景,每个场景都取决于其前身配置的系统状态。

对于习惯于进行单元测试的人来说,这并不合适 - 但这些情况不会被拆分并单独运行。

这里的最佳做法是什么?

我应该重写一个很长的场景吗?

我已经在使用'页面对象'保持我的大部分代码不在步骤定义中 - 我应该将步骤编码为单个调用,可以在以后的场景中重复使用吗?

我在Javascript中运行Cucumber。

2 个答案:

答案 0 :(得分:1)

首先,警告:

对于多数测试(并且大多数我的意思是99.9%的时间),您不应该继续前一个场景,因为如果一个场景在您的功能中失败因为你试图将它们串在一起,所以会更多地崩溃。

关于我的回答:

根据您是否尝试在(在同一功能中)之后为所有方案设置设置,或者是否要多次重复使用第一个方案(在单独的功能中),您可以执行以下操作之一的东西。

  1. 将第一个场景设为背景
  2. 将第一个场景转换为步骤定义,以便在多个要素文件中使用
  3. 对于第一个:

    Background:
      Given that the app is open
      When I open a certain dialog
      Then it has a thing somewhere
    
    Scenario: a
      Given that the dialog from 'a' is open...
    

    请记住,当您将其用作背景时,它将用于该功能中的所有以下场景。

    对于第二个:

    Scenario: a
        Given that the app is open
        When I open a certain dialog
        Then it has a thing somewhere
    
    Scenario: b
        Given I have opened the dialogue from a
        And the '<DialogFromA>' dialog is open...
    

答案 1 :(得分:1)

我会问自己,所有步骤背后的实际行为是什么?

然后我会将其实现为想要的行为,并在堆栈之间的步骤之间推送顺序。可能使用一个或多个辅助类。没有任何迹象表明你可以强制执行场景的顺序而不引入一些黑客来强制它们在一起。

请记住,BDD和Cucumber都是关于人类可读的沟通。在我看来,您要求的依赖关系应该在支持代码Gherkin触发器中实现。