【问题标题】:Gherkin - maintaining state between scenariosGherkin - 在场景之间维护状态
【发布时间】:2016-03-31 13:27:20
【问题描述】:

尽管我已经编写单元测试 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。

【问题讨论】:

标签: javascript cucumber gherkin cucumberjs


【解决方案1】:

第一件事,警告:

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

接着我的回答:

根据您是要尝试为之后的所有场景进行设置(在同一功能中),还是要多次重复使用第一个场景(在不同的功能中),您可以执行以下两种操作之一东西。

  1. 将第一个场景设为背景
  2. 将第一个场景变成一个步骤定义,用于多个功能文件

第一次:

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...

【讨论】:

  • 99.99% 的时间我都同意你的观点。对于 0.01% 的时间你认为可以使用之前场景中的状态,我不同意。只是我的教条意见。该状态要求场景按特定顺序运行,而不是在网格上。
  • 我唯一推荐它的时候是当您仍在为前一个场景开发步骤定义时,因此新场景仍然在 CI 中传递。在一个完美的世界中,将编写前一个场景的步骤定义,但是可能会有一个初级测试员,刚从大学编写文件,他可能不完全理解语言。在创建步骤定义或将之前的场景转换为背景后,它就会过时,因此将更改为正确的执行方式。
  • 谢谢,@KyleFairns -- 我已经编辑了这个问题,试图强调该功能有很长的场景链,每个场景都取决于它的前身。
  • 实际原因是浏览器自动化的速度。假设我有一个将产品添加到购物车的场景,然后我查看购物车是否有两个产品,然后我有一个场景来测试如果我删除这些产品,我的购物车中的商品为零。我意识到从纯粹主义者的角度来看,“最好”的事情是在删除场景中添加两个(使用第一个场景中的步骤)然后删除它们。但是,如果我有数百个测试要运行,这将是一个很大的浪费时间,而且这些测试足够多意味着没有人运行测试。
【解决方案2】:

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

然后我会将其实现为所需的行为,并将步骤之间的顺序向下推入堆栈。可能使用一个或多个辅助类。没有什么可以说你可以强制场景的顺序而不引入一些技巧来强制它们在一起。

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

【讨论】:

  • “请记住,BDD 和 Cucumber 都是关于人类可读通信的。” --- 我认为这是王牌,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 2010-11-29
  • 2023-03-07
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多