黄瓜:如何组织复杂的测试集

Sér*_*mes 5 cucumber

我有三个版本的后端我正在测试.我想针对这三个版本运行类似的功能规范.

最初,我以为我只是在目录结构中组织所有内容,如下所示:

features/
  v1/
    something.feature
    step_definitions/
      something_steps.rb
  v2/
    something.feature
    step_definitions/
      something_steps.rb
  v3/
    something.feature
    step_definitions/
      something_steps.rb
Run Code Online (Sandbox Code Playgroud)

然而,黄瓜似乎压扁了一切,这意味着我最终会采用模棱两可的步骤定义.

然后我想到了以下结构:

features/
  v1/
    something.feature
  v2/
    something.feature
  v3/
    something.feature
  step_definitions/
    something_steps.rb
Run Code Online (Sandbox Code Playgroud)

我在某个地方的特征文件中定义了一个变量,指出了一个用于哪个版本,并且我在步骤文件中有一堆"ifs",以根据该版本变量选择代码路径.但是,我还没有找到在功能文件中定义该变量的明显方法.

有什么方法可以组织东西,或者我只需创建多个"特征"根,每个版本一个,这将是一个糟糕的解决方案,因为它将意味着黄瓜的多次调用?

v1/
  features/
    something.feature
    step_definitions/
      something_steps.rb
v2/
  features/
    something.feature
    step_definitions/
      something_steps.rb
v3/
  features/
    something.feature
    step_definitions/
      something_steps.rb
Run Code Online (Sandbox Code Playgroud)

And*_*ndy 6

为什么多次调用黄瓜会是一件坏事?就个人而言,我就是这样做的,并且从Rakefile运行所有这三个功能,所以我不必一个接一个地做.

此外,如果冲突太大而您正在为每个版本重写整个步骤定义,那么您可能应该重新考虑如何对其进行措辞.如果代码如此不同,你真的应该把它描述为做同样的事吗?

如果变化较小,那么我建议查看标签钩子来实现你想要的.

所以你的功能可能如下所示:

@v1
Feature: some feature
  In order to test different versions
  As a cucumber user
  I want to be able to change step definitions based on what version feature is running

  Scenario: some scenario
    Given some thing
    When I pass some method
    Then I should get something
Run Code Online (Sandbox Code Playgroud)

您的步骤定义可能如下所示:

Before('@v1') do
  Thing = V1Thing
  VERSION = 1
end

Given /^some thing&/ do
  @thing = Thing.new
end

When /^I pass some method$/ do
  @thing.some_action!
end

Then /^I should get something$/
  thing = "something" if VERSION == 1
  thing = "something else" if VERSION == 2
  @thing.prop.should == thing
end
Run Code Online (Sandbox Code Playgroud)

即使步骤定义非常不同,您也可以使用此方法,但我认为管理起来会更困难.