プログラマでありたい

おっさんになっても、プログラマでありつづけたい

JenkinsとSelenium WebDriverでUI層のテストも自動化&永続化する


 思い立ったようにJenkins特集をしておりますが、今回はJenkinsとSelenium WebDriverでUI層のテストの自動化をする話です。Seleniumは面倒臭い画面のテストを自動実行してくれるツールで、出てきてからもう7〜8年がたちます。Web系の開発に携わっている人であれば、一度は試したことがあるのではないでしょうか?そして、必ず挫折したことがあると思います。
 その理由としては、せっかく作ったSeleniumのテストケースが腐ってくるからです。一般的にはUI層の変更は、ロジック層に比べて変化が激しいです。だからこそテスト自動化して保証することに意味があるのですが、そのテストケースを維持するのは大変です。そこで、Jenkinsの登場です。Jenkinsでサーバサイドで継続的に実行することにより、Seleniumのテストケースが成功を保てるようにします。また、複数のブラウザ・バージョンに対しても同時実行等することにより、問題に気が付きやすく出来ます。
※Seleniumのテストの導入が失敗する理由は、以前まとめてあります。

Jenkins+Seleniumの構成



 今回の構成は、Jenkins+SeleniumサーバとSeleniumのクライアントになるWindowsサーバです。全てAWS上に構築します。構成図としては、下記の図のようになります。左のJenkins+Seleniumサーバから右のWindows上の各種ブラウザを呼び出す形になります。

Jenkins+Seleniumの設定



 Jenkins側の設定ですが、今回は特におこないません。Jenkins用のSeleniumプラグイン等は幾つかあるのですが、それらを使わずにプログラム中からSeleniumのremoteWebDriverを呼び出すことで実現可能です。メリットとしては、プログラマブルに処理できるので、Seleniumのテストケースの保守性が高くなります。例えば、rubyのプログラムの場合、次のようにローカルのSeleniumを呼び出すようにして、サーバの方でクライアント側の設定を行うことにより、テストの環境依存を無くせます。
呼び出しプログラム

require 'selenium-webdriver'
driver = Selenium::WebDriver.for :remote, :url => "http://localhost:4444/wd/hub", :desired_capabilities => :firefox

Jenkinsサーバ兼Selenium Server

java -jar selenium-server-standalone-2.31.0.jar -rolhub

Selenium Client Server(Windows)

C:\selenium>java -jar selenium-server-standalone-2.31.0.jar -role webdriver -hub http://jenkins_server:4444/grid/register

デモ



 ブラウザでJenkinsを操作してJenkins兼Seleniumサーバから、別のWindowsサーバのFirefoxをSelenium remoteWebDriverをRubyで操作します。今回はYahooのページを表示しているだけですが、実際はそれぞれのシナリオをテストします。特にコストを掛けてブラウザを起動するので、IEやFirefox・ChromeなどのJavaScriptの動きの差異をするようなものが良いと思います。それ以外のものは、Seleniumを使わずにテストするのが良いでしょう。

まとめ



 JenkinsでCI(継続的インテグレーション)したい対象のテストケースを、しっかりと設定しておけばJenkinsでSeleniumのテストも簡単に実行出来ることが解りました。これで一番自動化しづらいUI層のテストをサーバーから自動的に実行できます。また、Jenkinsから実行することにより、(もちろんテストケースの保守は必要なものの)永続化も達成できました。次は、Jenkinsからクライアント側になるSeleniumのWindows Serverの管理について考えてみます。


See Also:
Web画面の自動テストの導入に失敗する理由とその対策
Selenium2.0 WebDriverで複数ブラウザのUIテスト もう一度、Selenium再入門
Jenkinsでビルド・パイプラインを構築する
Amazon Linux AMIにRuby用にJenkinsをインストールする
ユニットテストのデータ生成は、FixtureよりFactoryモデル