2

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

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

黄瓜可以吗?

请注意,我使用的是 MongoDB,所以我不使用事务而是截断,并且我相信每次测试后我都会自动运行 DatabaseCleaner,我想我必须禁用它(可能带有@mention?)

编辑 :

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

EDIT2:具体例子

  • 我需要测试我的搜索引擎是否总是返回相关结果(例如,在搜索“买家”时,它应该返回带有“买家”、“购买”、“购买”等的结果(与 ES 配置有关),并且其他上下文信息得到正确更新(例如在侧边栏中

  • 我的类别/过滤器带有括号中的命中数,我必须确保在用户使用过滤器时刷新这些数字)

为此,我在搜索引擎中预先设置了十几个结果,并运行所有基于相同输入的测试。我经常有“示例”子句,它们只是做了一些稍微不同的事情,但基于相同的种子

4

2 回答 2

1

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

  1. 使后台任务非常快。

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

  1. 使用单元测试工具。

考虑一下您是否真的从“测试”搜索的场景中获得任何好处。如果您不使用允许您更好控制的工具,因为您的测试是用编程语言编写的

  1. 破解黄瓜以不同的方式工作

我不打算讨论这个,因为我的答案就是寻找替代品

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

  1. 根本不要测试

通常,搜索引擎是我们使用的其他人的代码。他们有数以千计的单元测试和数以万计的满意客户,那么您的额外测试会带来什么价值?

于 2016-09-07T10:08:56.360 回答
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"
  ...
于 2016-09-02T14:30:58.600 回答