我有三个版本的后端我正在测试。我想针对这三个版本运行类似的功能规范。
最初,我以为我只是在目录结构中组织所有内容,如下:
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
然而,黄瓜似乎压扁了所有东西,这意味着我最终会采用模棱两可的步骤定义。
然后我想到了以下结构:
features/
v1/
something.feature
v2/
something.feature
v3/
something.feature
step_definitions/
something_steps.rb
我在某个地方的功能文件中定义了一个变量,指出了一个变量的版本,并且我在步骤文件中有一堆“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
答案 0 :(得分:6)
为什么多次调用黄瓜会是一件坏事?就个人而言,我就是这样做的,并且从Rakefile中运行所有这三个功能,所以我不必一个接一个地执行。
此外,如果冲突太大而您正在为每个版本重写整个步骤定义,那么您可能应该重新考虑如何对其进行措辞。如果代码如此不同,你真的应该把它描述为做同样的事吗?
如果更改较小,那么我建议您查看tags和hooks以达到您想要的效果。
所以你的功能可能如下所示:
@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
您的步骤定义可能如下所示:
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
即使步骤定义非常不同,您也可以使用此方法,但我认为管理起来会更难。