如何在同一功能下为所有场景运行一次Cucumber Background步骤?

时间:2016-09-02 09:59:16

标签: ruby-on-rails mongodb cucumber ruby-on-rails-5 database-cleaner

在Cucumber中,是否可以为整个功能运行后台步骤?那么每个场景都不会重复吗?

我正在搜索引擎上运行一些测试,我需要使用测试数据为搜索引擎预先播种。由于这些数据生成和处理的时间可能很长(我使用Elasticsearch并且我需要构建索引),所以我只做一次这样的背景,但仅适用于同一功能下的所有测试。

黄瓜有可能吗?

请注意,我使用的是MongoDB,因此我不使用事务而是截断,我相信每次测试后我都会自动运行DatabaseCleaner,我想我必须禁用(可能还有@)提?)

编辑:

是的我正在使用Cucumber和Rails的Ruby步骤

EDIT2:具体例子

  • 我需要测试我的搜索引擎总是返回相关结果(例如,搜索"买家"它应该返回结果"买家","购买","购买"等(与ES配置有关),其他上下文信息正确获取更新(例如在侧栏中

  • 我有类别/过滤器,其中包含括号中的点击次数,我必须确保在用户使用过滤器时刷新这些数字)

为此,我使用十几个结果为搜索引擎预先播种,然后运行所有基于相同输入的测试。我经常有"例子"只是做一些略有不同的条款,但基于相同的种子

2 个答案:

答案 0 :(得分:1)

假设搜索数据是场景的一个有意义的部分,那些阅读该功能的人应该知道,我将它放在一个步骤而不是隐藏在钩子中。没有内置的方法来做你想做的事情,所以你需要自己使步骤具有幂等性。最简单的方法是使用全局。

在features / step_definitions / search_steps.rb中:

$search_data_initialized = false

Given /^there is a foo, a bar and a baz$/ do
  # initialize the search data
  $search_data_initialized = false
end

在features / search.feature中:

Feature: Search

  Background:
    Given there is a foo, a bar and a baz

  Scenario: User searches for "foo"
  ...

答案 1 :(得分:1)

有很多方法可以做这种事情:

  1. 让后台任务非常快。
  2. 也许在您的情况下,您可以将搜索数据放在应用程序之外,然后在后台步骤中将其符号链接到应用程序中?这是一种首选方法。

    1. 使用单元测试工具。
    2. 考虑一下你是否真的从使用方案中获得任何好处来测试'搜索。如果您没有使用可以让您更好地控制的工具,因为您的测试是用编程语言编写的

      1. 黑客黄瓜以不同的方式工作
      2. 我不打算这样做,因为我的回答是关于寻找替代方案

        对于您测试搜索的特定示例,还有一种可能性

        1. 根本不要测试
        2. 通常搜索引擎是我们使用的其他人的代码。他们有成千上万的单元测试和成千上万的满意的客户,那么您的额外测试会带来什么价值?