Jenkinsによるテストの自動化

はじめに

Jenkinsの話(CIの話)を聞き、テストの自動実行がとても魅力的に感じたので、
空きPCに環境構築して体験してみた。

やりたいこと

  1. VisualStudioのソリューションファイルをビルドする。
  2. MSTestを使ったユニットテストの実行。
  3. ユニットテストの失敗時に通知する。

※Jenkins端末はインターネットに接続できないローカルLANに配置する予定な為、
通知の手段にIPMessenger(IP Messenger 開発研究室)を使用することにした。メール通知は今回は試してません。

インストール

今回はTracLightningというプロジェクト管理ツールを使用した。(これにJenkinsが含まれている)
Trac Lightning プロジェクト日本語トップページ - SourceForge.JP

インストール種類は、すべてインストール的なものを選択。
screenshot

プラグインのインストール

ソリューションファイルをビルドするために、Jenkins MSBuild Plugin
MSTestでの失敗を検出するために、Log Parser Plugin
をインストールしました。

1,Jenkinsの管理を選択
screenshot

2,プラグインの管理を選択
screenshot

3,プラグインをインストール
screenshot

※画像ではインストール済タブに表示されていますが、未インストール時には利用可能タブに表示されています。
チェックを入れてページ最下部のインストールボタンクリックでインストールされます。

プラグインの設定

Jenkinsの管理を選択し、管理ページを表示させる。
管理項目にインストールしたプラグインの設定項目が追加されている。

Jenkins MSBuild Plugin

設定例。MSBuild.exeのパスを指定する。
screenshot

Log Parser Plugin

設定例。空ファイルを作成し、それを指定する。
screenshot
保存ボタンをクリックしないと設定が反映されないので注意。

ジョブの登録

ジョブ=ビルド単位といったところでしょうか。ビルドしたいソリューションごとにジョブを作成する必要があります。
ジョブカレントディレクトリは、C:\TracLight\projects\hudson\.hudson\jobs\<ジョブ名>(デフォルト)です。

1,新規ジョブを選択
screenshot

2,ジョブ名と種類を選択する。種類はフリースタイル・プロジェクト
screenshot

3,今回はSubversionからソースコードを取得してビルドを行うので、設定する。
screenshot
使用しない場合は"なし"を選択する。

4,リポジトリの更新確認を定期的に行う場合の設定
画像だと、毎時0分(15:00、16:00、、、) にチェックを行いリビジョンが更新されている場合にビルドを行う。
screenshot

5,ビルドするソリューションファイルの設定
はじめにMSBuild用のビルド設定項目を追加。
screenshot
[

追加された項目へ対象のソリューションファイルを指定する。
screenshot
ソース管理を使用しない場合は、ソリューションファイルのフルパスを指定する。

6,テスト実行の設定
はじめにMSTestを実行するバッチ設定項目を追加。
screenshot

追加された項目へバッチファイルを指定する。
screenshot

MSTest実行バッチは下記の通り。失敗時にIPMessengerを使用した通知も行なっている。

setlocal

set MS_TEST_DIR="C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\"
set IPMSG_DIR="C:\Program Files\IPMsg\"
set PATH=%PATH%;%MS_TEST_DIR%;%IPMSG_DIR%

rem Jenkinsジョブルートを起点とした相対パス
set TEST_DLL_NAME="TestProject1\bin\Debug\TestProject1.dll"
set TRX_FULLPATH="TestResults\TestResults.trx"

set NOTICE_TARGET_HOST=192.168.111.104
set NOTICE_MSG=JenkinsSampleのテストに失敗しました!

rmdir /S /Q TestResults
mkdir TestResults
MSTest.exe /testcontainer:%TEST_DLL_NAME% /resultsfile:%TRX_FULLPATH%

if not %ERRORLEVEL% == 0 (
    IPMsg.exe /msg %NOTICE_TARGET_HOST% %NOTICE_MSG%
    echo "UnitTest is Failed"
)

endlocal
EXIT \B %ERRORLEVEL%

Jenkinsジョブではバッチファイルの実行結果が検出できないようなので、Log Parser Pluginで検出させる必要がある。
screenshot
保存ボタンクリックしないと設定情報が反映されないので注意。

プラグインの設定で指定した空ファイルへ、テスト失敗時に出力される文字列を指定する。

error /^"UnitTest is Failed"$/

ジョブの実行

手動ビルドまたはSCMポーリングでジョブが実行される。

テスト失敗時にポップアップされる!
screenshot

screenshot