SeleniumでE2Eテストを始めよう
オールアバウトのsankameです。
突然ですが、Webブラウザのテストってやりずらいですよね…
ブラウザ毎に挙動が違ったり、結局、担当者頼みになって、その人が代わったらまた障害が起きて…と。
エンジニアならこういう問題はさっさと自動化してスマートに解決したいものです。
※このアプリのソースコードはページ末尾のリンクからご利用下さい。
…とは言え、「なる早でリリースを」という場面ではテストは後回しにされがちで、さらに第2フェーズが始まると尚更テストに時間を割くのが難しくなります。(※1)
オールアバウトではユニットテストがまだ全アプリに入っていない状況ですが、とにかくハードルを下げつつ半年ほど前からE2Eテスト(※2)を実施しています。(※3)
(※1) オールアバウトには専任のQAチーム (Quality Assurance)がないため、開発エンジニアがそれを担当しています。
(※2) End to End Test (ネットワーク終端ホストによるテスト)。Webブラウザによる利用者視点でのテストと解釈。
(※3) Google社によると、本来は[ユニットテスト数] > [E2Eテスト数]とのこと…参考
ハードルを下げる
テストのハードルが高いのは、プロダクションコードと合わせてテストコードを書くのでコード量が倍になる点だと思います。
その負担を減らすため、まずはJavaScript (以下JS)エラーをチェックすることに特化したテストアプリを作成し、毎日動かすことにしました。GitHub URL
プラットフォーム
下記の理由でE2EテストにはSelenium + Javaを採用しています。
システム構成
準備
CentosとWindowsで予めSeleniumサーバーを起動しておきます。
(パスやバージョンは適宜読み替えて下さい)
$ java -jar /usr/local/src/selenium-server-standalone-2.41.0.jar -role hub
C:\apps\selenium>java -jar selenium-server-standalone-2.42.2.jar -role webdriver -hub http://【CentosのIP】:4444/grid/register
構成図
※図中のロゴは右のサイトより使用。 Selenium HQ さくらのナレッジ
処理フロー
○数字は上記の図に対応
① アプリがテスト対象のURLを読み込みます。
② アプリからWebDriver APIをコール。
③ 2つのSeleniumサーバーを中継します。
⑤ アプリは発生したJSエラーをWebDriverから受け取り、メールで通知します。(JSエラー収集はライブラリを使用)
特記事項
将来的にテスト対象のブラウザを増やしたり、テストの並列化ができるように、③でSeleniumサーバーをhubとnodeの関係にしました。
アプリはJenkinsで定期実行していましたが、Wercker+Deployerに移行しつつあるため、現在は暫定でRundeckから行っています。
WebDriverが対応しているブラウザのバージョンは決まっているため、敢えてブラウザの自動アップデートは止めています。
エラー修正
上記⑤のメールは開発者のメーリングリストに送信しています。
メールで送信するだけだと、そのエラーに誰が対応していてどんな状態なのか管理しずらいので、Google Apps Scriptを使ってGmailからGoogleスプレッドシートに自動で読み込ませるようにしています。
このシートをもとに、毎週の定例会議で「修正担当者をアサイン」→「進捗確認」を繰り返しています。
まとめ
次のステップとしては、リンクの飛び先や画面要素のチェックなど、Selenium本来の機能を活かしたテストコードを書いていく予定です。
また、現在は1日1回のテストを定時に実行しているだけなので、リグレッションテストという意味ではまだ不十分です。
将来的にはCIツールと連携して、ステージングにWebアプリをデプロイしたタイミングでE2Eテストを回したいと考えています。
ソースコード
プルリクなど頂ければ幸いです。
github.comGitHub - allabout/js-e2e-test: Selenium WebDriverを用いてJavaScriptの自動テストを行います。