nose + Jenkins + HipChat で Python アプリケーションを自動テストして結果を通知してもらおう!

はじめに

JenkinsとPythonのテストフレームワーク「nose」を使って、 簡単にテストの自動化を実現してしまおう!というのが今回の目標です。
「nose」を利用すれば、「test(もしくはTestでも可)」から始まるPythonファイルを、 自動で識別、実行してくれるので、プログラムの規模が大きくなった場合でも比較的簡単にテストを行うことが出来ます。

更にその実行結果を「HipChat」を通じてメンバーにテスト結果を周知したり、 テスト結果をJenkinsで読み込んでグラフ化したり、より効率的なテストの実行を目指します。

上記の目標を基に、JenkinsとPythonのテストを連携させる方法をまとめてみました!

全体的な流れ

以下の通りで進めていきます!

  1. JenkinsでPythonテスト自動化、HipChatに通知するため事前準備を行う
  2. 作成したジョブの設定を変更する
  3. テスト自動化の設定を行う

JenkinsでPythonテスト自動化、HipChatに通知するため事前準備を行う

JenkinsからHipChatへテスト結果を通知するために、Jenkins側でHipChatのプラグインを入れてください。

テストを実行するための新規ジョブを作成します。

「新規ジョブ作成」をクリックしてお好きなジョブ名を入力します。
続いて、「フリースタイル・プロジェクトのビルド」を選択しOKボタンを押しましょう。

作成したジョブの設定を変更する

上から順にやっていきます。

HipChat Notifications

  • ProjectRoom…通知したい通知したいHipChatのroom名を入力

あとは必要に応じてチェックを入れていってください。
基本的には全てにチェックを入れて通知がんがん飛ばしちゃいましょう。 苦情が出たら変えてやるぐらいの気持ちで。

HipChat通知

ソースコード管理

色々選べますが、今回は「Mercurial」を利用した方法をご紹介します。

  • MercurialVersion…2.4.2
  • Repository URL…リポジトリのパスを指定
  • Credentials…-なし
  • Revision Type…Branch
  • Revision…develop

Mercurial設定

ビルド

「ビルドの手順の追加」から「シェルの実行」を選択し、「シェルスクリプト」欄に以下を記述します。

shnosetests --with-xunit

ビルド設定

これだけです。
noseが「test」から始まる関数を自動で認識、実行し、 オプションに設定した「–with-xunit」で実行結果をxml形式で出力してくれます。
出力されるxmlのファイル名は「nosetests.xml」です。
後々使うので覚えておいてください。

当たり前ですが、noseを利用するためには実行サーバー側にnoseがインストールされていなければなりません。
easy_installないしpipを使用してインストールしておいてください。

easy_install nose

もしくは

pip install nose

また、xml形式で結果を出力するために使用するオプション「–with-xunit」ですが、 これを利用するために次のライブラリを併せてインストールしてください。

easy_install unittest-xml-reporting

もしくは

pip install unittest-xml-reporting

ビルド後の処理

[JUnitテスト結果の集計]の[テスト結果XML]に先ほど覚えていてもらった「nosetests.xml」を指定します。
更に、最初の方で設定したHipChatへの通知を実行してもらうべく、 「HipChat Notifications」を追加してください。

ビルド後の処理設定

この並びで。

ここまでで一旦保存です。
設定通りちゃんとテストが行われるか、「ビルド実行」からテストを実行してみてください。
HipChatに通知は出ましたか?テストは成功しましたか?
望んだとおりの結果が得られればOKです!
テストの成功、失敗の遷移はグラフで視覚的に確認することが出来ます。

テスト結果グラフ

テストが失敗したら赤で表示されます。 この場合のグラフは7回目の実行の際に、7件のテスト中2件が失敗したということを表しています。

テスト自動化の設定を行う

いよいよテスト自動化の設定に移ります。
先程はスルーした「ビルド・トリガ」項目の「SCMをポーリング」にチェックを入れ、 テスト実行のスケジュールを設定します。
スケジュールはcronの書式で記載でき、 実行タイミング毎にリポジトリの変更を確認して変更されていればテストを実行します。
以下は5分毎に設定した場合の記述例です。

リソースを効率的に活用するため、頭に「H(ハッシュ)」を付けました。
同時間帯に複数のジョブの実行タイミングが設定されていても、同時実行を避けることが出来ます。

まとめ

テスト実行と実行結果周知の手間が省けて一石二鳥な感じです。
どっちも地味な作業の割には必要不可欠で尚且つ手間だったりするので、 可能な限りJenkinsにお任せしてもいいかもしれません。
テストの結果をグラフで可視化できるというのも魅力の一つです。 見た目にインパクトがあった方が焦りませんか?ビルド履歴にも実行結果の可否は表示されていますが、 なんとなくこんなもんかって流し見してしまったり…
あとあまりJenkinsを利用したことがない人にとってもわかりやすいですし、 テストの効率も上がっていきそうな予感。

但し、リポジトリの内容が変更されるたびにテスト実行されます。
んでもってそのたびにHipChatに通知が行くんでお気をつけて…