我想在每个黄瓜特征文件之前只执行一次特定步骤。黄瓜特征文件可以有多个场景。我不想要在每个场景之前执行的后台步骤。每个要素文件都可以有一个步骤(每个要素都不同),只执行一次。所以我不能在钩子之前使用该步骤,因为我对每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。
答案 0 :(得分:2)
黄瓜并不能真正支持你的要求。使用黄瓜钩实现这一点的方法是使用这两个doc:
https://github.com/cucumber/cucumber/wiki/Hooks#tagged-hooks
https://github.com/cucumber/cucumber/wiki/Hooks#running-a-before-hook-only-once
您可以适当地标记所有要素文件,并且可以实现标记为在每个要素标记基础上执行一次的挂钩。
它并不漂亮,但它可以在不等待功能请求(或使用其他工具)的情况下完成您想要的任务。
答案 1 :(得分:1)
这可以通过将Before,After,Around或AfterStep挂钩与一个或多个标签相关联来实现。例子:
Before('@cucumis, @sativus') do
# This will only run before scenarios tagged
# with @cucumis OR @sativus.
end
答案 2 :(得分:1)
这必须是Cucumber邮件列表中最常见的前5个问题。你可以用钩子做你想做的事。但是你几乎肯定不应该做你想做的事。通过采用这种方法节省的执行时间完全超过了调试这种方法通常会导致的间歇性故障所需的时间和精力。
创建自动化测试的基础之一是从一致的地方开始。当您拥有在场景中设置关键内容的代码,但不是针对每个场景运行时,您必须执行以下操作:
在您的示例中,您必须确保每个方案中的每个操作都以您的原始网页网址结束。如果只有一种情况不能做到这一点,那么你最终会出现间歇性的失败,你将不得不经历每一个场景来找到你的罪魁祸首。
通常,将您的设置代码设置得足够快,以便您不必担心在每个场景之前运行它都会更容易,更有效。
答案 3 :(得分:0)
是的,这可以通过传递特征文件中的实际值并在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);
}
您还可以查看以下链接以获得更清晰的图片: https://thomassundberg.wordpress.com/2014/05/29/cucumber-jvm-hello-world/
答案 4 :(得分:0)
已经给出了一些建议,尤其是引用official documentation的建议,它使用全局变量来存储是否已经运行了初始设置。
对于我的情况,多个功能一个接一个地执行,我不得不通过检查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
来确定是否需要进行任何初始设置。