seleniumを導入して簡単なテストを行うまで
seleniumってなんなんだよ、っていうのは、[ThinkIT] 第1回:Webブラウザを使ったテストツールSeleniumとは (1/3)にお任せするとして、seleniumを導入して、簡易テストを行えるようになるまでの手順をまとめます。
seleniumを使いたい動機
某案件で、基本機能はほぼ同じドメインが複数できてしまうので、いちいちテストをするのはめんどくさいなー、と思っている時に、色々と調べていて、seleniumが自動テストツールとしていいらしい、という噂を耳にしたのがきっかけです。
ブラウザで行える操作は基本的に行えるようなので非常に便利だと思い、ひとまずどんなものか調べてみました。
selenium-IDEを利用したテスト
selenium-IDEはfirefoxのアドオンとして提供されている。
普通に検索して探すと亜種っぽいものがいっぱい見つかるので注意。
http://release.seleniumhq.org/selenium-ide/1.0.10/selenium-ide-1.0.10.xpiからダウンロード
例
Googleのトップページの検索窓でrubyと入力して、検索ボタンを押し、検索結果のトップである「オブジェクト指向スクリプト言語Ruby」へのリンクをクリック
と言う挙動は、次のような形のHTMLでのテストケースとなる。
CTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head profile="http://selenium-ide.openqa.org/profiles/test-case"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="selenium.base" href="http://www.google.co.jp/" /> <title>New Test</title> </head> <body> <table cellpadding="1" cellspacing="1" border="1"> <thead> <tr><td rowspan="1" colspan="3">New Test</td></tr> </thead><tbody> <tr> <td>open</td> <td>/</td> <td></td> </tr> <tr> <td>click</td> <td>q</td> <td></td> </tr> <tr> <td>clickAndWait</td> <td>link=オブジェクト指向スクリプト言語 Ruby</td> <td></td> </tr> </tbody></table> </body> </html>
selenium-IDEを使うだけなら、このHTMLのテキストケースは大した意味はなくて、GUI上のテストケースを実行をポチッと押せば、勝手にテストを実行してくれる。
ここでのテストケースは、次のselenium-RCで意味をもってくる。
selenium-RCを利用したテスト
selenium-IDEだけでも十分便利だけど、そのままだとFirefoxでしかテストが実施できない。
他のブラウザでも当然テストが必要になる。
そこで、(たぶん)selenium-RCが活躍することになる。
seleniumには種類が多くて、どの場合にどれを使えばよいかはまだよくわかっていないけど、とりあえず、特定のドメインのWebページに対して、ブラウザ上から何らかの操作を加えるという場合、selenium-RCがサーバーへのセットアップが必要なくていいらしい。
詳細な仕組みはまだよくわかっていないので、それはおいおい調べていくとして、今はとりあえず、自動でテストを繰り返せる仕組みを作りたい。
selenium-RCの使いかた
selenium-RCを動かすためにはJDKが必要(Jarファイルを動かせればいいので、本当にJDKが必要かはよくわかっていない)なので、Javaアプリケーションサーバー構築(Tomcat6) - CentOSで自宅サーバー構築を参考に、まずはJDKの準備。
- テストケースの用意。ここは、手で打ち込んでもいいけど、selenium
IDEで作成したものを利用すればいい。具体的な流れはusuilog-プログラミングメモ: [Testing]Selenium RCとSelenium IDEでWEBアプリのUIテストを簡単自動化を見れば、簡単に理解できるはず。すごく分かりやすくまとまっています。
簡単にいうと、ダウンロードしてきて、解凍すれば、後は実行するだけ。
その中のselenium-serverというディレクトリにあるselenium-server.jarに、selenium
IDEで作った、上記テストケースを食わせれば、テストが始まる。
コマンドは以下のとおり。
java -jar selenium-server.jar -htmlSuite <ブラウザ> <テスト対象サイトURL> <テストスイートファイル> <テスト結果ファイル>
ここまで進めてきて、上の起動コマンドなどを見ていると、テストケースがHTMLで作成されているのは、あくまでひとつの表現方法なんだろうな、と予想できる。
htmlSuiteオプションを付けているから、HTMLで記述したテストを実行しているのだろう。
Rubyを使ってテスト
続いて、いよいよ今回やりたかったプログラム上からseleniumを呼び出してテストを実行する方法を。
まだテストの書き方に熟知していないので、今回もテストケースの作成にはselenium-IDEを利用する。
selenium-IDEはデフォルトではHTMLでテストケースが記述されるが、「オプション」->「フォーマット」から様々な言語に対応した形でテストが記述されます。
つまり、selenium-IDEで各言語用のテストケースを作成して、それを流用する、という流れ。
で、テストを行うことができる。
この段階で普通にrubyプログラムを実行するとエラーになる。
ソースを見ればわかるけど、selenium-clientとかいうライブラリを読んでいるので
それをまずgemでインストール
$ sudo gem install selenium-client
以下が今回のテスト(Google.rb)
Selenium::Client::Driver.newで諸々設定している。
browserを'*chrome','*googlechrome'としたり'*iexplore','*piiexplore'とすればchromeやIEでもテストが可能となる。
require "test/unit" require "rubygems" gem "selenium-client" require "selenium/client" class Google < Test::Unit::TestCase def setup @verification_errors = [] @selenium = Selenium::Client::Driver.new \ :host => "localhost", :port => 4444, :browser => "*firefox", :url => "http://www.google.co.jp/", :timeout_in_second => 60 @selenium.start_new_browser_session end def teardown @selenium.close_current_browser_session assert_equal [], @verification_errors end def test_google @selenium.open "/" @selenium.type "q", "ruby" @selenium.click "btnG" @selenium.wait_for_page_to_load "30000" @selenium.click "link=オブジェクト指向スクリプト言語 Ruby" @selenium.wait_for_page_to_load "30000" end end
上記テストケースをテスト。
プログラムの実行前にselenium-RCのサーバ起動を忘れずに
$ java -jar selenium-server.jar
その後、プログラムの実行。問題がなければにょきにょきブラウザが立ち上がってくる。
$ ruby Google.rb Loaded suite Google Started . Finished in 13.607071 seconds. 1 tests, 1 assertions, 0 failures, 0 errors
test_google2みたいな感じで、テストを追加していくことで、複数のテストケースを実行することができます。
掲示板への投稿などや、ログイン操作など、ブラウザを利用して行う動きのほとんどを実行できるので非常に便利だと思いました。
キャプチャを利用したり、JSを実行できたりするようなので、seleniumそのものの挙動を含めて、もう少し調べてみたいところです。