turnipを使ってシナリオテストを自動化

turnipは、シナリオテストを自然言語風のDSLで記述・実行させることができるruby製のツールです。
ここでは、wikipediaを開いて「カブ」を検索するというシナリオを例にしてみます。

事前に

webページの操作にはCapybaraを使います。
今回はrackアプリではないので、HTTP通信を行うためのdriverを別途用意する必要があります。
今回は比較的導入が楽でありHeadless(GUIを必要としない)ドライバであるPhantomJSを利用します。
OSXであれば、下記でインストールできます。

$ brew install phantomjs

準備

まずディレクトリを用意しましょう。
今回は、railsなどとは組み合わせず、シンプルにturnipだけを使います。

$ mkdir turnip_sample
$ cd !$

$ bundle init

Gemfileに下記を記載し、bundle installを実行します。

source "https://rubygems.org"

gem 'turnip'
gem 'capybara'
gem 'poltergeist'

rspecとturnipの設定ファイルを用意します。

$ rspec init
$ echo '-r turnip/rspec' >> .rspec

spec/turnip_helper.rbを下記の内容で作成します。

require 'turnip/capybara'
require 'capybara/poltergeist'

Capybara.default_driver = :poltergeist

Dir.glob("spec/**/*steps.rb") { |f| load f, true }

これで、turnipでwebアプリのシナリオテストを書く準備が整いました。

featureファイル

featureファイルを下記の内容で作成します。

spec/features/sample.feature

Feature: 検索する

  Scenario: wikipediaでカブを検索する
    Given wikipediaトップページにアクセスする
    When wikipediaトップページを表示する
    Then ウィキペディアへようこそと表示されている
    And searchにカブを入力する
    And searchButtonボタンをクリックする
    Then アブラナ科アブラナ属の越年草と表示されている

featureファイルは、いわゆるテストシナリオの定義ファイルです。
自然言語で書ける(日本語にも対応している)ため、非エンジニアにとっても理解しやすいと思います。

stepファイル

stepファイルを下記の内容で作成します。

spec/steps/sample_step.rb

step 'wikipediaトップページにアクセスする' do
  Capybara.app_host = "http://ja.wikipedia.org"
end

step 'wikipediaトップページを表示する' do
  visit '/'
end

step %(:textと表示されている) do |text|
  expect(page).to have_content(text)
end

step %(:fieldに:valueを入力する) do |field, value|
  fill_in field, with: value
end

step %(:textボタンをクリックする) do |text|
  click_button text
end

テスト実行

無事にテストが通過するはずです。

$ rspec
JQMIGRATE: Logging is active
JQMIGRATE: Logging is active
.

Finished in 5.6 seconds (files took 0.29979 seconds to load)
1 example, 0 failures

featureファイルとstepファイルの関係

featureファイルが自然言語風なDSLなのでイメージしにくいかもしれませんが、featureファイルから、stepファイルに定義したメソッド(実際にはstep)を呼び出している、と考えるとわかりやすいかと思います。
上記の例ですと、
featureファイルのThen ウィキペディアへようこそと表示されているという記述で、stepファイルの、step %(:textと表示されている)のstepが呼ばれます。
:textとすることで、そこに入る文字列を動的に指定出来て汎用的になります。

参考

Rubyist Magazine - エンドツーエンドテストの自動化は Cucumber から Turnip へ
[RSpec][Turnip] 一般的に使えるTurnipステップ集 | TechRacho
Turnip について (1) / まずは動かす - Thanks Driven Life
Ruby製アプリじゃなくてもTurnipで自動受け入れテストがしたい - orangain flavor
Rails + Turnip + Capybara + poltergeistでBDDテスト - Qiita
Capybara WebkitをCentOSで使えるようにする方法 – 日本の天ぷら情報
poltergeist - Capybaraを使う際に知っておきたいこと - Qiita