Ruby 只需在特性文件之前执行一次步骤(每个特性可能有不同的步骤)

Ruby 只需在特性文件之前执行一次步骤(每个特性可能有不同的步骤),ruby,selenium-webdriver,cucumber,capybara,site-prism,Ruby,Selenium Webdriver,Cucumber,Capybara,Site Prism,我只想在每个特征文件之前执行一次特定步骤。功能文件可以有多个场景。我不想要在每个场景之前执行的后台步骤。每个要素文件都可以有一个步骤(每个要素的步骤不同),该步骤只执行一次。因此,我不能使用前钩子的步骤,因为我每20个功能都有一个特定的步骤。小黄瓜样本如下所示: Scenario: This will execute only once before all scenario in this current feature When Navigate to the Page URL Scena

我只想在每个特征文件之前执行一次特定步骤。功能文件可以有多个场景。我不想要在每个场景之前执行的后台步骤。每个要素文件都可以有一个步骤(每个要素的步骤不同),该步骤只执行一次。因此,我不能使用前钩子的步骤,因为我每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。

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

Before('@cucumis, @sativus') do
  # This will only run before scenarios tagged
  # with @cucumis OR @sativus.
end

Cucumber并不真的支持你的提问。使用cucumber钩子实现这一点的一种方法是使用以下两个文档:

您可以适当地标记所有功能文件,并且可以实现每个功能标记执行一次的标记前钩子


它并不漂亮,但它可以实现您想要的功能,而无需等待功能请求(或使用其他工具)。

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

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);
}
您还可以查看以下链接以获得更清晰的图片:

这一定是Cucumber邮件列表中最常见的5个问题之一。你可以用钩子做你想做的事。然而,你几乎肯定不应该做你想做的事。采用这种方法节省的执行时间完全被调试这种方法通常导致的间歇性故障所需的时间和精力所抵消

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

  • 确保您的设置代码创建了一个始终如一的基础(这很容易)
  • 确保使用此基础的每个场景都不会以任何方式修改基础(这非常困难)
  • 在您的示例中,您必须确保每个场景中的每个操作都在原始页面URL上结束。如果只有一种情况不能做到这一点,那么你将以间歇性故障告终,你将不得不经历每一种情况才能找到罪魁祸首


    一般来说,将精力投入到使设置代码足够快的工作中会更容易、更有效,这样您就不必担心在每个场景之前运行它了。

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

    对于我的情况,在多个功能相继执行的情况下,我必须通过检查
    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\u setup
    然后可以分步骤使用,以确定是否需要进行任何初始设置。

    这里可以找到一些关于它的讨论-我实际上改变了主意,在功能文件之前只执行一次特定步骤。我已经对此进行了配置并发现了问题,如果一个场景失败,那么它将导致另一个场景失败。正如“恶魔”所说。谢谢分享。