最近仕事でJavaのSelenium Web Driverを使う機会があったので、Rubyでも使ってみました。
さらに、せっかくテストに使うならやっぱりテストフレームワーク使いたいよねってことで、TestCaseクラスを使うことに。
TestCaseを使う
JavaのJUnitは使ったことがあり、基本的に使い方は同じです。
#test/unit/search_test.rb #encoding: utf-8 require 'test_helper' class SearchTest < Test::Unit::TestCase def setup #各テスト実行前が呼び出される初期処理 end def teardown #各テスト実行後に呼び出される後処理 end def test001 #テスト処理 end end
Test::Unit::TestCaseを継承したクラス内にメソッドを定義するだけ。
メソッドの役割は各コメントに書いてある通り。
「test」から始まるメソッドがテスト実行対象として、自動実行されます。
実行するには、
ruby test/unit/search_test.rb
をコマンドラインから叩けばOK。
が、僕の環境ではtest_helperがLoadErrorとなってしまったので・・・
ruby -Itest test/unit/search_test.rb
としました。
ちなみにrubyのIオプションは直後のパスをロードパスに指定(追加)するというものです。
Selenium Web Driverを使う
Seleniumは言わずと知れたブラウザ自動操作を実現するフレームワークです。
Selenium Web Driverは各言語のソースコードにより、ブラウザ操作を定義・実行させることができます。
Rubyで利用する場合はGemパッケージとして提供されているselenium-webdriverを使います。
#Gemfile gem 'selenium-webdriver' #これを追加
で
bundle install
しましょう。
実装方法はリファレンスを参照。
TestCaseとSelenium Web Driverを組み合わせるとこんなかんじ。
(かんけんで検索を実行してスクリーンショットを取るテスト)
#test/unit/search_test.rb #encoding: utf-8 require 'test_helper' require 'rubygems' require 'selenium-webdriver' class SearchTest < Test::Unit::TestCase #初期処理 def setup @driver = Selenium::WebDriver.for :firefox #firefox用のインスタンス生成 @driver.navigate.to "http://kanken.wackwack.net" #テストサイトを開く @timestamp = Time.now.strftime("%Y%m%dT%H%M%S") end #後処理 def teardown @driver.quit #画面を閉じる end def test001 keyword = @driver.find_element(:name,"keyword") #タグのname属性による要素取得 keyword.send_keys "オライリー" #文字を入力する keyword.submit #フォームの実行 sleep(2) #スクリーンショットを撮る @driver.save_screenshot("./test/unit/#{@timestamp}-001.png") assert true end end
sleepは重要。ここで画面遷移を待たないと、遷移前画面のスクリーンショットを撮ってしまう。
しかしここがやっぱり不便ですね・・・
遷移後の画面が表示されるまでの時間は常に同じでは無いので。
何か良い方法はないのだろうか。