Jenkins で CakePHP 1.3の自動テストを行う
仕事でCakePHP 1.3のユニットテストを書きました。 Jenkinsで自動実行させるのが、前にやったときより簡単にできたので 手順をご紹介します。 (職場はLinuxで、紹介するのはMac OS Xでの手順なのでいくつか違う点がありますが)
環境
今回は次の環境に自動テスト環境を作ってみました。 Mac OS Xにインストールしてみましたが、Cent OSにインストールしたときでも、Jenkinsのインストールとテスト実行コマンド以外はほとんど設定方法にかわりはありません。 なお、CakePHPの環境はすでに構築済みでSubversionでバージョン管理していることとします。
- Mac OS X 10.7(Lion)
- PHP や ApacheはHomebrewで用意しました(PHP は5.3.10がインストールされています)
- CakePHP 1.x系のテスト結果をJenkinsに取り込む為に必要なStagehand_TestrunnerがPHP 5.2.0以降必須なので、5.1.xな環境では以下の自動テスト環境は構築できません
インストール
まずテスト実行に必要なStagehand_TestrunnerとSimpleTestをインストールします。
Stagehand_Testrunner
CakePHP 1.x系のテストを実行してJenkinsが集計できる形式の出力を得るために Stagehand_Testrunnerが必要ですのでインストールします (もともとSimpleTestの出力結果はJenkinsで扱えなかったのにStagehand_Testrunnerを使うと扱えるようになるという素晴らしいツールです。CakePHP2でSimpleTestではなくPHPUnitを使うので、Stagehand_Testrunnerを使わずに済むようになります)
pear channel-discover pear.piece-framework.com
pear install piece/stagehand_testrunner
Homebrewをインストールするときは /usr/local/bin をPATHに追加すると思いますが、 Stagehand_Testrunner をインストールしても各種コマンドはここにインストールされませんので 別途 /usr/local/bin/cakerunner にリンクします
cd /usr/local/bin
ln -s ../Cellar/php/5.3.10/bin/cakerunner cakerunner
Simpletestの追加とテスト用データベースの設定
CakePHP 1.x系用のテスティングフレームワークのSimpleTestがまだ追加されていない
場合は追加します。
SimpleTest - Unit Testing for PHPから
SimpleTest 1.0.x系の最新版(現在は1.0.1)をダウンロードします。
展開するとsimpletestというディレクトリになるので(ならない場合はリネームします)
vendorsディレクトリ(またはapp/vendors)に移動します
次にJenkinsで自動テストするためのデータベースを作成します
CREATE DATABASE cakephp13_citest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON cakephp13_citest.* TO user@localhost IDENTIFIED BY 'password';
この設定をapp/config/database.php の DATABASE_CONFIG::$testの配列に書いておきます
var $test = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'cakephp13_citest',
'prefix' => '',
//'encoding' => 'utf8',
);
ここまでで、手元でテストを実行できるようになりましたのでテストしてみてください
% cd /path/to/cakeproject
% /usr/local/bin/php /usr/local/bin/cakerunner --cakephp-core-path=./cake --cakephp-app-path=./app --log-junit=unittest.xml -R ./app/tests/cases/
The test suite generated by Stagehand_TestRunner
OK
Test cases run: 0/0, Passes: 0, Failures: 0, Exceptions: 0
Jenkinsのプロジェクトを作る際は手元の環境で一度cakerunnerを実行させてからやるとトラブルシューティングが楽になります
Jenkinsのインストール
Jenkinsのインストールは簡単でした。Jenkins CIからMac OS X用のパッケージをダウンロードし、 インストーラの指示に従ってインストールすると、ブラウザで http://localhost:8080 が開きます。 (開かない場合は開いてください)
Jenkinsプロジェクトの追加
まず http://localhost:8080 を開いたら「新規ジョブ追加」を選択します。ジョブ名は「cakephp13」で、フリースタイルプロジェクトを選択しましょう
次のページでは設定項目がずらっと並びますのでぽちぽち設定します。
- ソースコード管理システムはSubversionを選択し、リポジトリURLを入力
- チェックアウト方式で'svn update'を実行 を選択
- ビルド・トリガでSCMをポーリングを選択(=リポジトリから定期的にチェックアウトして、更新があったらテスト実行)
- スケジュールは「0 * * * *」1時間に1回
ビルド - シェルの実行で次のコマンドを入力します
/usr/local/bin/php /usr/local/bin/cakerunner --cakephp-core-path=${WORKSPACE}/cake --cakephp-app-path=${WORKSPACE}/app --log-junit=unittest.xml -R ${WORKSPACE}/app/tests/cases/
ビルド後の処理で、「JUnitテスト結果の集計」をチェックして、テスト結果XMLには「unittest.xml」と入力します。
これで一番下の「保存」を押しましょう。テストが失敗したときにすぐ知りたい場合は、すぐ上のE-mail通知設定をしてもよいでしょう。
テストを書いてみる/追加してみる
もし、テストが1つも書かれていない場合、Jenkinsの設定に問題なくてもJenkinsにはテスト失敗と判断され、赤いアイコンが表示されます。
試しにテストを追加したりすると、テスト数推移のグラフが表示されて楽しい感じになるので、テストを書いて見ましょう。書き始めるならモデルからでもいいですが、ルーティングのテストがもっと簡単だと思います。参考:CakePHP routes.phpの確認はユニットテストで - Shin x blog
参考文献
- CakePHPアプリをHudsonで継続的インテグレーションする方法 | Ryuzee.com ほとんど、こちらの記事の内容と同じですが、build.xmlを書かずに済むようになっています。