Cucumber入门之_Hooks&Background

[复制链接]
查看11 | 回复4 | 2015-9-22 15:53:22 | 显示全部楼层 |阅读模式
本帖最后由 AlexQin 于 2012-6-18 14:39 编辑
作者:Even.He
出处:http://www.cnblogs.com/puresoul/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Hooks
在很多情况下,我们需要在每个scenario之前(before)和之后(after)执行某些相同的操作。比如说在测试完成后要关闭浏览器。在Cucumber中,我们可以使用hooks. 在Cucumber中,有三种不同的hooks:
  Before: 在每个scenario前执行
  After: 在每个scenario后执行
  AfterStep: 在每个scenario后执行
我们可以把这些hooks放在features文件夹下面的任何ruby文件里面,但一般推荐的做法是把它们放在features/support/hooks.rb 文件里,这样让我们更容易记住我们的代码放在哪。
另外,Hooks可以被定义任意次。如果在每个scenario之前有十件不同的事需要我们去处理,我们可以定义十个Before 钩子(hooks),他们会按定义的顺序去执行。
当我们有很多个hooks时,我们有时候可能不需要让它们全部运行,这时候我们就可以使用标签钩子(tagged hooks).


回复

使用道具 举报

千问 | 2015-9-22 15:53:22 | 显示全部楼层
Tagged Hooks
标签hooks跟一般的hooks差不多,但是它只有特定的scenario上运行。即: 跟它有相同tag的 scenario才会执行。
例:
  Before("@foo") do

    puts "This will run before each scenario tagged with @foo"

  end复制代码
优缺点: 优点:很显然,hooks的优点是可以在每个scenario之前或之后做一些共同的操作。 缺点:Hooks是在Ruby文件中定义的,对于非技术人员来说是不易读的,除非case失败,否则不会有什么证据表明它们的存在。在这种情况下,我们就可以使用Background.


回复

使用道具 举报

千问 | 2015-9-22 15:53:22 | 显示全部楼层
Background
当我们希望steps在feature文件里面可见时,我们可以使用background代替Before钩子,它们可以为每个scenario创建逻辑的上下文。
Background会在每个scenario之前执行,就像Before钩子一样。但如果存在Before 钩子,那个它们会先于background执行。
当我们有相同的操作时,为了遵守DRY原则,我们可以选择hooks或background。至于选择哪一种方式,取决于当它们明确的出现在feature文件里是否有价值。


回复

使用道具 举报

千问 | 2015-9-22 15:53:22 | 显示全部楼层
下面看一个小示例:
目录结构:


1.jpg (7.96 KB, 下载次数: 2)
下载附件
2012-6-18 14:37 上传

testhook.feature
Feature: Test how to use hooks
In order to learn how to use hooks
as a learner
I want to do some practice

@hotel
Scenario:search a hotel
Given I visit to hotel launch page

Scenario:search a flight
Given I visit to flight launch page复制代码  在该feature文件中定义了两个scenario,第一个scenario有一个tag: @hotel(为了说明tagged hooks的用法),另一个没加tag。两个scenario都只有一个步骤,在这我们就不纠结这些了,只为演示hooks的的用法。 testhook.rbGiven /^I visit to hotel launch page$/ do
puts "The current page is the hotel launch page."
end

Given /^I visit to flight launch page$/ do
puts "The current page is the flight launch page."
end复制代码该文件是对feature文件的具体实现,在这两个Given中我都只是简单的打印出了一句话。
hooks.rbBefore do
#Before("@hotel") do
#tagged hooks
puts "This is before hook."
end

After do
#After("@hotel") do #tagged hooks
puts "This is after hook."
end复制代码
  在该hooks文件中,我定义了before和after钩子,也都只是简单的输出一句话。注:第2,7行分别为tagged钩子,当执行它们时,只有跟它们匹配的tag的scenario前/后会执行此hook。


回复

使用道具 举报

千问 | 2015-9-22 15:53:22 | 显示全部楼层
运行结果:
执行非tagged hooks:
This is before hook.

The current page is the hotel launch page.

This is after hook.

This is before hook.

The current page is the flight launch page.

This is after hook.复制代码执行tagged hooks:
This is before hook.

The current page is the hotel launch page.

This is after hook.

The current page is the flight launch page.复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行