EC2＋Sauce Labsを使ってSeleniumのテストを高速に(Cucumber編)

# はじめに

* [EC2＋Sauce Labsを使ってSeleniumのテストを高速に(Rspec編)](http://qiita.com/oh_rusty_nail/items/db619a2ebb042b187629)の続き
* 今回はCucumber編

# テスト作成＆実行

## 設定ファイルなどの編集 

* 基本的に[EC2＋Sauce Labsを使ってSeleniumのテストを高速に(Rspec編)](http://qiita.com/oh_rusty_nail/items/db619a2ebb042b187629)と同様の手順です


```
$ rails new sample_app2 --skip-bundle
```

* サンプルRailsアプリ作成

```:Gemfile
group :test, :development do
  gem 'sauce', '~> 3.1.1'
  gem 'sauce-connect'
  gem 'parallel_tests'
  gem "capybara", "~> 2.0.3"
  gem "cucumber-rails", :require => false
  gem "sauce-cucumber", :require => false
  gem "rake", "10.1.0"
  gem "execjs"
  gem "therubyracer"
  gem "database_cleaner"
end
```

```
$ bundle install
$ rails generate cucumber:install
$ rake sauce:install:features
```

```rb:features/support/sauce_helper.rb
require "sauce"
require 'sauce/capybara'
require "sauce/cucumber"

Capybara.default_driver = :sauce

Sauce.config do |c|
  c[:browsers] = [ 
    ["Windows 8", "Internet Explorer", "10"],             
    ["Windows 7", "Firefox", "20"],
    ["OS X 10.8", "Safari", "6"],                         
    ["Linux", "Chrome", nil]          
  ]
end
```

## テスト作成

```rb:features/ramen.feature
Feature: Finding ramen

@selenium
Scenario: I should be able to find delicious Ramen on Wikipedia 
  When I go to Wikipedia.com
```

* 今回のテストもwikipediaでラーメンを検索するだけw

```rb:features/step_definitions/ramen.rb
When(/^I go to Wikipedia.com$/) do
  visit "http://en.wikipedia.org/"
  fill_in 'search', :with => "Ramen"
  click_button "searchButton"
  page.has_content?('Ramen')
end
```

## テスト実行

```
$ export SAUCE_USERNAME=XXXXXXXXXXXXXX
$ export SAUCE_ACCESS_KEY=XXXXXXXXXXXXXX

$ bundle exec cucumber
Using the default profile...
Feature: Finding ramen

  @selenium
  Scenario: I should be able to find delicious Ramen on Wikipedia # features/ramen.feature:4
[Connecting to Sauce Labs...]
    When I go to Wikipedia.com                                    # features/step_definitions/ramen.rb:2
    When I go to Wikipedia.com                                    # features/step_definitions/ramen.rb:2
    When I go to Wikipedia.com                                    # features/step_definitions/ramen.rb:2
    When I go to Wikipedia.com                                    # features/step_definitions/ramen.rb:2

1 scenario (1 passed)
1 step (1 passed)
3m37.807s
```

* 結果はRspecのときのようにコンソール出力とブラウザから動画で閲覧できます
* 実行コマンドの引数などでブラウザ指定などしなくて済むので楽ですね

# おまけ

* bundle exec cucumberを実行したら以下のようなエラーが発生したが、これはSeleniumでおなじみなタイムアウトのようです

```
$ bundle exec cucumber
Using the default profile...
Feature: Finding ramen

  @selenium
  Scenario: I should be able to find delicious Ramen on Wikipedia # features/ramen.feature:4
[Connecting to Sauce Labs...]
 Sauce Connect failed to connect after 90 seconds (RuntimeError)
 /home/ec2-user/.rvm/gems/ruby-1.9.3-p545/gems/sauce-connect-3.1.0/lib/sauce/connect.rb:82:in `wait_until_ready'
 /home/ec2-user/.rvm/gems/ruby-1.9.3-p545/gems/sauce-3.1.3/lib/sauce/utilities/connect.rb:16:in `start'
 /home/ec2-user/.rvm/gems/ruby-1.9.3-p545/gems/sauce-cucumber-3.1.1/lib/sauce/cucumber.rb:70:in `around_hook'
 /home/ec2-user/.rvm/gems/ruby-1.9.3-p545/gems/sauce-cucumber-3.1.1/lib/sauce/cucumber.rb:155:in `Around'
```

# 非Railsアプリでのテスト作成・実行
* 基本的に本ページの「テスト作成＆実行 」節で書いたファイルのとおり
* 以下の構成になっていればよい
 * Gemfile
 * fearures/xxx.feature
 * fearures/support/sauce_helper.rb
 * features/step_definitions/xxx_steps.rb
* 手を加えるのはfearures/support/sauce_helper.rb内に「include Capybara::DSL」を加えるだけ
* テスト実行も同じ方法

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください