モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

JenkinsからSelenium IDEのテストケースを使って自動テストを行う

この記事はNSEGアドベントカレンダーの10日目の記事と、
Selenium/Appium Advent Calendar 2015の22日目の記事です。

概要

Selenium IDEというWeb UIの自動テストを行うツールで作ったテストケースを、Jenkinsというビルドやテストの自動化を行うCI(継続的インテグレーションツール)から呼び出して、定期的にWeb UIのテストを行う環境を構築します。


以前、Web UIのテスト自動化をしたいと考えていた時、

JenkinsとSeleniumでJavaScriptのテスト自動化、最初の一歩。第1回 日本Seleniumユーザーコミュニティ勉強会 − Publickey

のエントリーを読んで、JenkinsからSelenium IDEを使ったWeb UIのテストの定期実行できるということを知りました。

普通JenkinsからはSelenium Web Driverを利用すると思いますが、テストプログラムを書けなくてもSelenium IDEなら使えるという層がいる場合、Selenium IDEでのテストを使えるのは大きいです。

なのでこれはぜひ導入したいと思いました。


しかし、このエントリーではSeleniumhq Pluginを入れれば簡単に出来そうな感じに見えたのですが、実際に導入しようとすると結構色々とノウハウが必要でした。

そこで、Jenkins + Selenium IDEの導入方法と、その環境へのジョブの投入方法について説明します。

導入環境
注意点
  • Firefoxでテスト、selenium-serverでテスト、Jenkinsで順を追って動作確認する
  • Xvfbのインストールが必要
  • XMODIFIERS="@im=scim" 設定無いと途中で止まる
  • jenkinsアカウントでFirefoxのプロフィールを生成しておく
  • 「テストケース」でなく「テストスイート」を与える
  • resultは別ディレクトリに生成する

環境構築

Jenkinsのインストール
  • yum install jenkins
    • /var/lib/jenkins 以下にjenkinsのシステムが存在している。
    • オーナー、グループは「jenkins.jenkins」
  • jenkinsアカウントのシェル変更
    • 「jenkins」ユーザのシェルはデフォルトだと「/bin/false」になっているが、「jenkins」ユーザで入って確認や設定をしたいことが多いため、/bin/bash等にしてパスワードも設定しておく。
  • jenkinsアカウントのパスワード設定
    • jenkinsの環境から問題なくテストが動くか確認したりするため、jenkinsアカウントのパスワードの設定を行い、ログイン可能なようにしておく。
selenium serverの準備
% cd /var/lib/jenkins
% ln -s selenium-server-standalone-2.42.2.jar selenium-server.jar
Jenkinsの設定

プラグインインストール

システム設定

  • 「Jenkinsの管理」→「システムの管理」選択
  • 「グローバルプロパティ」→「環境変数」をチェック
    • 日本語変換指定
      • CentOS5の場合XMODIFIERSの設定をしないとFirefoxの動作がうまくいかない
      • キー:XMODIFIERS
      • 値:@im=scim
    • Javaエンコーディング指定
      • レポートページの日本語が文字化けを防ぐ
      • キー:_JAVA_OPTIONS
      • 値:-Dfile.encoding=8859_1
  • 「Xvfb installation」選択
    • Name:Xvfb
    • ジョブ作成時に利用するXvfbを指定するための名前なので適当でよい。
  • Selenium Remote Control」
    • htmlSuite Runner:/var/lib/jenkins/selenium-server-standalone.jar
サーバ側Firefoxの準備
% yum install firefox xorg-x11-server-Xvfb

クライアント側(Windows)でXの表示可能にする
動作テスト

サーバのFirefoxを起動してプロファイル生成と表示の確認

  • Windows上でMobaXTermを起動
  • サーバに「jenkins」アカウントでsshで接続
  • firefox」でWindows上にサーバ上で起動されたFirefoxの画面が表示されるか確認
    • ここでfirefoxが起動するとプロファイルが生成ダイアログで確認され生成される
    • これをせずにselenium-server経由での表示をしようとするとダイアログで進めずにはまるので注意
  • 外部サイトが見えるか確認

サーバのFirefoxSelenium IDEプラグインを導入

サーバのFirefoxからテストケースが実行可能か確認
テストケース内のパスの違いやFirewallの問題のため、Windows上では問題なかったテストケースがサーバ上では動作しない場合がある。
そのため、サーバ上のFirefoxでもテストケースがきちんと動くか確認する。

  • /var/lib/jenkins などにテスト的に作成したテストスイート「example_suite_1.html」とテストケース「example_test_1.html」のようなファイルをアップロード
  • サーバ上のfirefoxを起動してSelenium IDEを開く(検索バー横に「Se」と書いてあるアイコンか「Tools」→「Selenium IDE」)
  • テストスイート「example_suite_1.html」を読み込み(Selenium IDEの「File」→「テストスイートを開く」)
  • テストスイート実行(「アクション」→「テストスイート全体を実行」)

selenium-server経由で自動テスト可能か確認

  • Windows上でMobaXTermを起動
  • サーバに「jenkins」アカウントでsshで接続
  • 環境変数を設定
$ export XMODIFIERS="@im=scim"
    • CentOS5の場合、XMODIFIERSの設定をしないとFirefoxの動作がうまくいかなかったので注意
  • selenium-server経由でテストケースを実行
$ java -jar selenium-server-standalone.jar -htmlSuite *firefox http://www.example.com example_suite_1.html example_result_1.html
  • サーバ上のfirefoxの画面でテストが正常に動作し、終了後自動的にfirefoxが閉じられることを確認
    • テストが終了してもfirefoxが閉じられない場合、テストスイートではなくテストケースを実行していないか確認する。

画面出力をXvfbにして自動テスト可能か確認

  • Windows上でMobaXTermを起動
  • Xvfbを起動する
$ Xvfb :99 -ac -screen 0 1024x768x24 &
$ export DISPLAY=:99
$ export XMODIFIERS="@im=scim"
  • selenium-server経由でテストケースを実行
$ java -jar selenium-server-standalone.jar -htmlSuite *firefox http://www.example.com example_suite_1.html example_result_1.html
  • コンソールに何行かINFOが表示され最後に「15:09:34.372 INFO - Killing Firefox...」と出て終了し、「example_result_1.html」にテスト結果が書かれていることを確認

自動テスト項目の作成

大まかな流れ

  • Jenkinsの管理画面から自動テストの「ジョブ」を作成する
  • テストで使われるSelenium IDEのテストファイルをsftpで置く
  • 動作確認と定期実行指定
新規ジョブ作成
  • Jenkinsのダッシュボードから「新規ジョブ作成」
  • ジョブ名:
    • 半角英数の他のジョブ名と重ならない適当な名前
    • サーバ上のworkspaceディレクトリ名がそのままその名前で付けられるため、日本語ではなく半角英数で付けることを推奨。
    • この例では「example_test」とする。
  • 「フリースタイル・プロジェクトのビルド」を選択。
  • 「OK」を押すと詳細設定ページヘ遷移。
  • ソースコード管理
    • 「なし」を選択。
  • ビルド・トリガ
    • 一旦、なしで設定。
    • テストして問題なく動いたら「定期的に実行」で定時テストにする。
  • ビルド環境
    • 「Start Xvfb before the build, and shut it down after.」をチェック。
    • 「高度な設定」を選択
    • Xvfb screen:「1024x768x24」
    • スクリーンショット撮ることを考えて画面サイズと色数の指定をする。
  • 「ビルド手順の追加」→「SeleniumHQ htmlSuite Run」を選択
    • browser:Firefoxでテストする場合は「*firefox
    • startURL:対象となるサーバURL「http://www.google.com/」など
    • suiteFile:Selenium IDEで作った『テストスイート』ファイル。テストケースでは『ない』ことに注意。
    • この例では「selenium/example_suite_1.html」とする。
    • resultFile:テスト結果が書かれるHTMLファイル名。レポート生成のため別フォルダにすること。
    • この例では「result/example_result_1.html」とする。
  • 「ビルド後の処理の追加」→「Publish Selenium Report」
    • 「SeleniumHQ htmlSuite Run」の「resultFile」と同じものを指定。
    • この例では「result/example_result_1.html」とする。
  • 「ビルド後の処理の追加」→「Publish Selenium Html Report」
    • 「SeleniumHQ htmlSuite Run」の「resultFile」の『ディレクトリのみ』であることに注意。
    • この例では「result/」とする。
    • ここで間違ってresultFileと同じものを指定するとぬるぽを吐いてしまうため要注意。
    • またresultフォルダを別にせずテストケースと同じところに出力していると、そちらも解析しようとして失敗する。
  • 「保存」を押すとプロジェクトのページヘ遷移。
テストスイート・テストケースファイルの登録
  • プロジェクトのページの「ビルドの実行」を押してワークスペースを作成
    • ジョブ生成時点ではワークスペースが作られていない状態のため。
    • ワークスペースは「/var/lib/jenkins/workspace」以下に作られる。
    • この例だと「/var/lib/jenkins/workspace/example_test」となる。
  • sshやsftpなどでサーバに入って「/var/lib/jenkins/workspace/example_test」内に下記例のようにディレクトリ作成
    • ディレクトリ名は同じでなくても良い。オーナー、グループは「jenkins.jenkins」にするほうが問題ないだろう。
    • selenium」→Seleniumで生成したテストスイート、テストケースファイルを置く
    • 「result」→テスト結果のみを保持する
    • 「screenshot」→スクリーンショットを保存する
  • sftpでテストスイートとテストケースを保存
    • この例では「/var/lib/jenkins/workspace/example_test/selenium/」以下のフォルダに
    • テストスイート「example_suite_1.html」と、そこから呼び出されるテストケース
    • 「example_test_1.html」「example_test_2.html」を保存する。
テストの動作確認と定期実行設定
  • テストの動作確認
    • Jenkinsのダッシュボードに先ほど登録した「example_test」プロジェクトが出ているので選択。
    • 「ビルドの実行」を選択すると自動テストが開始する。
    • 「ビルド履歴」に出てくる日時の横▼から「Console Output」を見るとテストの実行状況が確認出来る。
    • Selenium Report」を見ると各テストの結果詳細を確認できる。
    • ワークスペース」からファイルを確認出来るため、スクリーンショットの確認も可能。
  • 定期実行の設定
    • プロジェクトの「設定」を選択
    • 「ビルドトリガ」→「定期的に実行」をチェック
    • スケジューリング:毎日早朝4時にテストする例「H 4 * * *」

*1:CentOSは諸事情により6ですらなく5です。しかし6でもあまり変わらないと思います。