redmine のテストを Cucumber と Selenium2.0 WebDriver を使って firefox と IE の2つのブラウザでやってみる

というわけで次は cucumber と組み合わせてみる。

構成

redmine <--> firefox <--> selenium <--> capybara <--> cucumber

になるのかな?

準備するもの

さっきの続きなので、追加したものだけ。

Selenium陣営

rails, cucumber-rails は雛形作りたいためだけのもの…。

Redmine陣営

特になし。

Capybara 使った cucuber の雛形を持ってくる

Railsアプリを準備
> rails new test-app
Gemfile に cucumber-rails, capybara を追加

group test に突っ込んだ。

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
  gem 'cucumber-rails'
  gem 'capybara'
end
雛形を作る
> cd test-app
> ruby script/rails generate cucumber:install --capybara

雛形だけがほしかったので、
test-app\features にあるファイルとフォルダを、どこぞにコピーする。

+ using-cucumber
  + step_definitions
    + web_steps.rb
  + support
    + env.rb
    + paths.rb
    + selectors.rb

動くようにコードを改変

rails アプリの中で動かすならこれでいいのだけれど、
今回は外から rails のテストをするので、改変しないとエラーが出て動かない。
※ 多分ちゃんとやり方があるに違いない。

env.rb

# -*- encoding: utf-8 -*-
require "Capybara"
require "Capybara/cucumber"
require 'test/unit/assertions'
World(Test::Unit::Assertions)

Capybara.app_host = "http://127.0.0.1:3000"
Capybara.default_driver = :selenium
Capybara.javascript_driver = :selenium
Capybara.default_wait_time = 2
Capybara.add_selector(:name) do
  xpath { |name| XPath.descendant[XPath.attr(:name) == name.to_s] }
  match { |value| value.is_a?(Symbol) }
end
Capybara.add_selector(:class_name) do
  xpath { |class_name| XPath.descendant[XPath.attr(:class) == class_name.to_s] }
  match { |value| value.is_a?(Symbol) }
end

feature をもくもくと書く

web_steps.rb も成長させる
できあがった feature はこんな感じ。

redmine_walpurugis_night.feature

Feature: redmine_walpurgis_nights
  In order to extend life of universe
  As Incubator
  wants more energy.

  Scenario: Register new issue
    Given I go to toppage
    When  I follow "ログイン"
     And  I fill in "username" with "qb"
	 And  I fill in "password" with "homuhomu"
	 And  I press "login"
    
	When  I select "Walpurgis Night"
	 And  I follow "New issue"
	
	When  I select "Feature" from "issue_tracker_id"
     And  I fill in "issue_subject" with "As Incubator, I want magical girl."
	 And  I fill in "issue_description" with "foobaa"
	 And  I select "High" from "issue_priority_id"
	 And  I select "qb incubator" from "issue_assigned_to_id"
	 And  I press "commit"
	 
	When  I follow "Issues"
	Then  I should see following data at the head of issue list:
	  |tracker|status|priority|subject                           |assigned_to |
	  |Feature|New   |High    |As Incubator, I want magical girl.|qb incubator|
詰まったところ。
  • テーブルを見つけて、目的の値を取り出す(WebDriver と同じような操作で大丈夫だった)

初めての人がつまづきそうなところは、まとめたほうがいいかもなー。

残りの宿題

  • コードを github にあげる
  • akephalos を使ってみる
  • SeleniumIDE の formatter として cucumber(capybara) を作る
    • アル程度、定型にしちゃえば何とかできるじゃないのかな? と思ったり。これないと不便でしょうがない。