3

我只想在每个黄瓜功能文件之前执行一次特定步骤。一个黄瓜特征文件可以有多个场景。我不希望在每个场景之前执行背景步骤。每个功能文件都可以有一个步骤(每个功能不同),该步骤只执行一次。所以我不能在钩子之前使用那个步骤,因为我每 20 个功能都有一个特定的步骤。小黄瓜示例如下所示:

Scenario: This will execute only once before all scenario in this current feature
When Navigate to the Page URL

Scenario: scenario 1
When Some Action
Then Some Verification

Scenario: scenario 2
When Some Action
Then Some Verification

Scenario: scenario 3
When Some Action
Then Some Verification

我希望你们能理解我的问题。我在我的框架中使用 Ruby Capybara Cucumber。

4

5 回答 5

2

Cucumber doesn't really support what you are asking about. A way to implement this with cucumber hooks would be to use these two pieces of doc:

https://github.com/cucumber/cucumber/wiki/Hooks#tagged-hooks

https://github.com/cucumber/cucumber/wiki/Hooks#running-a-before-hook-only-once

You would tag all your feature files appropriately and you can implement tagged Before hooks that execute once on a per feature tag basis.

It's not beautiful but it accomplishes what you want without waiting on a feature request (or using a different tool).

于 2016-02-18T01:16:14.523 回答
1

这可以通过将 Before、After、Around 或 AfterStep 挂钩与一个或多个标签相关联来实现。例子:

Before('@cucumis, @sativus') do
  # This will only run before scenarios tagged
  # with @cucumis OR @sativus.
end
于 2016-02-18T00:10:54.513 回答
1

这必须是 Cucumber 邮件列表中最常见的 5 个问题。你可以用钩子做你想做的事。但是,您几乎可以肯定不应该做您想做的事。采用这种方法节省的执行时间完全超过了调试这种方法通常会导致的间歇性故障所花费的时间和精力。

创建自动化测试的基础之一是从一致的地方开始。当您有在场景中设置关键内容的代码,但并非针对每个场景都运行时,您必须执行以下操作:

  1. 确保您的设置代码创建一个一致的基础开始(这很容易)
  2. 确保每个使用这个基础的场景,根本不以任何方式修改基础(这非常非常困难)

在您的示例中,您必须确保每个场景中的每个操作都以您的原始页面 URL 结束。如果只有一个场景无法做到这一点,那么您最终会出现间歇性故障,您将不得不经历每一个场景才能找到罪魁祸首。

一般来说,努力使设置代码足够快,这样您就不必担心在每个场景之前运行它,这样会更容易、更有效。

于 2016-02-22T16:13:55.397 回答
0

已经给出了一些建议,特别是引用官方文档的建议,该文档使用全局变量来存储初始设置是否已运行。

对于我的情况,多个功能一个接一个地执行,我必须通过检查是否scenario.feature.name已更改来再次重置变量:

$feature_name ||= ''
$is_setup ||= false

Before do |scenario|
  current_feature_name = scenario.feature.name rescue nil
  if current_feature_name != $feature_name
    $feature_name = current_feature_name
    $is_setup = false
  end
end

$is_setup然后可以在步骤中使用,以确定是否需要进行任何初始设置。

于 2016-07-27T13:08:06.997 回答
0

是的,这可以通过在您的功能文件中传递实际值并(\\d+)在您的 java 文件中使用“”来完成。请查看下面显示的代码以更好地理解。

Scenario: some test scenario
Given whenever a value is 50

myFile.java,编写步骤定义如下图

@Given("whenever a value is (\\d+)$")
public void testValueInVariable(int value) throws Throwable {
 assertEqual(value, 50);
}

您还可以查看以下链接以获得更清晰的图片: https ://thomassundberg.wordpress.com/2014/05/29/cucumber-jvm-hello-world/

于 2016-02-19T10:03:00.287 回答