seleniumを導入して簡単なテストを行うまで

seleniumってなんなんだよ、っていうのは、[ThinkIT] 第1回:Webブラウザを使ったテストツールSeleniumとは (1/3)にお任せするとして、seleniumを導入して、簡易テストを行えるようになるまでの手順をまとめます。

seleniumを使いたい動機

某案件で、基本機能はほぼ同じドメインが複数できてしまうので、いちいちテストをするのはめんどくさいなー、と思っている時に、色々と調べていて、seleniumが自動テストツールとしていいらしい、という噂を耳にしたのがきっかけです。
ブラウザで行える操作は基本的に行えるようなので非常に便利だと思い、ひとまずどんなものか調べてみました。

用意するもの

環境

CentOS 5
Windows7 64bit環境では文字コードの問題(?)か日本語の部分でこけまくったので、ひとまずVMware上のCentOSで下記の実験を行いました。)

selenium-IDEを利用したテスト

selenium-IDEfirefoxのアドオンとして提供されている。
普通に検索して探すと亜種っぽいものがいっぱい見つかるので注意。
http://release.seleniumhq.org/selenium-ide/1.0.10/selenium-ide-1.0.10.xpiからダウンロード

selenium-IDEの使いかた

  1. selenium IDEの起動
  2. BaseURLにテストを行いたいドメインを入力(例:http://www.google.co.jp/)
  3. ウィンドウの右端にある赤丸ボタンを押下すると記録開始(起動直後は既に押下状態)
  4. 適当に操作。この時のブラウザの操作が記録されている。
  5. 「現在のテストケースを実行」で先ほど記録したものをselenium-IDE上でテスト

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の準備。

  1. テストケースの用意。ここは、手で打ち込んでもいいけど、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で各言語用のテストケースを作成して、それを流用する、という流れ。

  1. selenium-IDEでテスト作成
  2. rubyプログラムでのテストケースにコンバートして保存
  3. selenium-RCのサーバーを起動
  4. 先ほどコンバートしたrubyプログラムのテストの実行

で、テストを行うことができる。

この段階で普通にrubyプログラムを実行するとエラーになる。
ソースを見ればわかるけど、selenium-clientとかいうライブラリを読んでいるので
それをまずgemでインストール

$ sudo gem install selenium-client

以下が今回のテスト(Google.rb)
Selenium::Client::Driver.newで諸々設定している。
browserを'*chrome','*googlechrome'としたり'*iexplore','*piiexplore'とすればchromeIEでもテストが可能となる。

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そのものの挙動を含めて、もう少し調べてみたいところです。