CakePHP2.X+PHPUnit+jenkinsでテストを自動化する

やっとここまできた!
今までjenkinsの設定は色々やってきたけど、今回はやっとテストを自動化させるところを書いていく。

1. PHPUnitのインストール

PHPUnitのインストールは、前回のCakePHPでPHPUnitを手動インストールしたときのメモで対応済みだが、jenkinsが入っているサーバーと前回のものは別のため、こっちはpear channelからインストールする方法で試してみる。

$ pear channel-discover pear.phpunit.de
$ pear install --alldeps phpunit/PHPUnit

2. コマンドラインからPHPUnitを実行してみる

$./app/Console/cake test app AllTests
Welcome to CakePHP v2.2.1 Console
---------------------------------------------------------------
App : app
Path: /var/lib/jenkins/jobs/test-project/workspace/app/
---------------------------------------------------------------
CakePHP Test Shell
---------------------------------------------------------------
PHP Fatal error:  Class 'PDO' not found in /var/lib/jenkins/jobs/test-project/workspace/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php on line 26

こんなエラーが出た。
CakePHP2系とCakePHP1系のDB設定周りの違いでも書いたが、CakePHP2系からPDOを使うようになったので、yum経由で必要な RPMパッケージをインストール。

$ yum -y install php-pdo
$ yum -y install php-mysql

もう一度試す。

$./app/Console/cake test app AllTests

Welcome to CakePHP v2.2.1 Console
---------------------------------------------------------------
App : app
Path: /var/lib/jenkins/jobs/test-project/workspace/app/
---------------------------------------------------------------
CakePHP Test Shell
---------------------------------------------------------------
PHPUnit 3.6.12 by Sebastian Bergmann.

..........

Time: 0 seconds, Memory: 16.00Mb

OK (10 tests, 0 assertions)

いけた。
これでPHPUnit側の設定は完了。

3. Jenkinsプラグインを導入

コマンドラインからのテストが可能になったので、これをJenkinsで実行できるようにする。
とりあえず必要なプラグインをインストール。
・xUnit Plugin https://wiki.jenkins-ci.org/display/JENKINS/xUnit+Plugin
・Clover PHP Plugin https://wiki.jenkins-ci.org/display/JENKINS/Clover+PHP+Plugin

4. Jenkins側の設定 – ユニットテスト単体で動作させてみる。

設定>ビルド>シェルの実行に以下のシェルスクリプトを登録。
./_lib/app/Console/cake test \
–log-junit=./reports/unittest.xml \
–coverage-html=./reports/coverage_html \
–coverage-clover=./reports/coverage.xml \
app AllTests

この内容でビルドの実行を行う。

ビルド後の処理で、それぞれ以下のように設定
Clover PHP カバレッジレポートを集計> Clover XMLパス reports/coverage.xml
Clover HTMLレポートを公開する> Clover HTMLレポート ディレクトリ reports/coverage_html/

JUnitテスト結果の集計>テスト結果XML reports/unittest.xml

ビルドを実行すると以下のような結果が返ってくる。

ガバレッジはこんな感じ。

5. Phingで他の処理と合わせて自動化する

CakePHP経由で処理したかったので、PhingのPHPUnitTaskは利用せずにExecTaskで記述した。
こんな感じ。

<target name="phpunit" >
  <exec executable="./app/Console/cake" >
    <arg line="
     test
     --log-junit=./reports/unittest.xml
     --coverage-html=./reports/coverage_html
     --coverage-clover=./reports/coverage.xml
     app AllTests" />
 </exec>
</target>

で、このテストを正常に動作させるにはworkspaceにexportされたフォルダの権限を一部変更する必要があるので、その対応をphpunitの処理の前に追加。

<chmod file="./app/Console/cake" mode= "0755" verbose= "true" />
<chmod file="./app/tmp/" mode= "0777" verbose= "true" />
<chmod file="./app/tmp/logs/" mode= "0777" verbose= "true" />
<chmod file="./app/tmp/sessions/" mode= "0777" verbose= "true" />
<chmod file="./app/tmp/tests/" mode= "0777" verbose= "true" />
<chmod file="./app/tmp/cache/" mode= "0777" verbose= "true" />
<chmod file="./app/tmp/cache/persistent/" mode= "0777" verbose= "true" />
<chmod file="./app/tmp/cache/models/" mode= "0777" verbose= "true" />
<chmod file="./app/tmp/cache/views/" mode= "0777" verbose= "true" />

これでとりあえずいけるようになった。
もっとうまいやり方もありそうだけど、とりあえずこれでしばらくやってみることにする。

ここら辺を参考にさせていただきました

CakePHP2.0+Jenkinsで継続的インテグレーションを行う方法 – Ryuzee.com
ビルドをAntではなくPhingにした場合のbuild.xml – Play of Color