Symfoware

Symfowareについての考察blog

JenkinsとGitBucketを連携し、CodeIgniterのテストを自動実行する(GitBucket Plugin)

GitBucketのレポジトリにプッシュしたら、自動的にJenkinsのジョブが実行されるように設定出来ました。
JenkinsとGitBucketを連携し、pushされたら自動的にソースを取得する(GitBucket Plugin)

レポジトリにプッシュされたら、CodeIgniterのテストを自動実行するよう構成してみます。



phpのインストール



Jenkinsサーバーでphpが実行できるようにしておきます。


# apt-get install php5-cli





CodeIgniterでのテストはこちら。
CodeIgniter 3 ユニットテストクラス(Library Reference - Unit Testing Class)

まず、手動でテストが通るか確認しておきます。

Jenkinsが取得したソースは、
[web.xmlで指定したHUDSON_HOME]/jobs/[プロジェクト名]/workspace
に展開されています。

私の場合は、/opt/jenkins/jobs/test/workspaceにソースがありました。
ここでテストが実行できるか確認します。

今回、こんなテストコントローラーを作成しました。


  1. <?php
  2. class Test extends CI_Controller {
  3.     
  4.     function __construct() {
  5.         parent::__construct();
  6.         
  7.         // unit_testライブラリのロード
  8.         $this->load->library('unit_test');
  9.     }
  10.     
  11.     public function index() {
  12.         // コンソールからの実行以外は処理しない
  13.         if (!is_cli()) {
  14.             return;
  15.         }
  16.         
  17.         // テストを実行
  18.         $this->unit->run(1, 1, 'first test');
  19.         
  20.         // 結果を表示
  21.         echo $this->unit->report();
  22.         
  23.     }
  24.     
  25. }




手動で実行できるか確認してみます。
※index.phpの後のtestはコントローラー名です。


# cd /opt/jenkins/jobs/test/workspace
# php5 index.php test







Jenkinsでの実行



プロジェクトの設定画面で、ビルド時にシェルを実行するように構成します。
指定するコマンドは以下のようになります。
※index.phpの後のtestはコントローラー名です。
別のコントローラー名の場合は変更します。


php5 index.php test



553_01.png


手動でジョブを実行してみます。

553_02.png


ビルドのコンソール出力を見てみると、ちゃんとテストが実行されたようです。

553_03.png





結果表示のカスタマイズ



テスト結果がhtml形式で表示されるので確認しづらいです。
この時のために、事前に調べておきました。
CodeIgniter 3 ユニットテストをコマンドで実行する


テストコントローラーをこんな感じに修正します。


  1. <?php
  2. class Test extends CI_Controller {
  3.     
  4.     function __construct() {
  5.         parent::__construct();
  6.         
  7.         // unit_testライブラリのロード
  8.         $this->load->library('unit_test');
  9.     }
  10.     
  11.     public function index() {
  12.         // コンソールからの実行以外は処理しない
  13.         if (!is_cli()) {
  14.             return;
  15.         }
  16.         
  17.         // テストを実行
  18.         $this->unit->run(1, 1, 'ok test');
  19.         $this->unit->run(1, 2, 'error test');
  20.         
  21.         // 結果を配列で受け取る
  22.         $results = $this->unit->result();
  23.         
  24.         // 内容をチェック
  25.         foreach($results as $result) {
  26.             // テストが通過している場合は簡易表示
  27.             if ($result['Result'] == 'Passed') {
  28.                 echo $result['Test Name'] . ':Passed'. PHP_EOL;
  29.                 continue;
  30.             }
  31.             
  32.             // 失敗しているときは詳細を表示
  33.             echo $result['Test Name'] . PHP_EOL;
  34.             echo $result['Test Datatype'] . PHP_EOL;
  35.             echo $result['Expected Datatype'] . PHP_EOL;
  36.             echo $result['Result'] . PHP_EOL;
  37.             echo $result['File Name'] . PHP_EOL;
  38.             echo $result['Line Number'] . PHP_EOL;
  39.             echo $result['Notes'] . PHP_EOL;
  40.         }
  41.         
  42.     }
  43.     
  44. }





レポジトリに変更をプッシュすると自動的にテストが実行されるはずです。
コンソール出力が確認しやすくなりました。

553_04.png





エラーの判別



上記の結果には重大な問題点があります。
わざとエラーになるテストを書いているのに、エラーになってくれません。

Jenkins、何でエラーを判別してるのかなと思いつつ、
きっと終了コードだろうとあたりをつけてみました。

http://php.net/manual/ja/function.exit.php

テスト終了後、exitで終了コードを明示してやります。


  1. <?php
  2. class Test extends CI_Controller {
  3.     
  4.     function __construct() {
  5.         parent::__construct();
  6.         
  7.         // unit_testライブラリのロード
  8.         $this->load->library('unit_test');
  9.     }
  10.     
  11.     public function index() {
  12.         // コンソールからの実行以外は処理しない
  13.         if (!is_cli()) {
  14.             return;
  15.         }
  16.         
  17.         // テストを実行
  18.         $this->unit->run(1, 1, 'ok test');
  19.         $this->unit->run(2, 2, 'error test');
  20.         
  21.         // 結果を配列で受け取る
  22.         $results = $this->unit->result();
  23.         
  24.         // 終了コード
  25.         $exit_code = 0;
  26.         
  27.         // 内容をチェック
  28.         foreach($results as $result) {
  29.             // テストが通過している場合は簡易表示
  30.             if ($result['Result'] == 'Passed') {
  31.                 echo $result['Test Name'] . ':Passed'. PHP_EOL;
  32.                 continue;
  33.             }
  34.             
  35.             // 失敗しているときは詳細を表示
  36.             echo $result['Test Name'] . PHP_EOL;
  37.             echo $result['Test Datatype'] . PHP_EOL;
  38.             echo $result['Expected Datatype'] . PHP_EOL;
  39.             echo $result['Result'] . PHP_EOL;
  40.             echo $result['File Name'] . PHP_EOL;
  41.             echo $result['Line Number'] . PHP_EOL;
  42.             echo $result['Notes'] . PHP_EOL;
  43.             
  44.             // 失敗している場合は、終了コード1
  45.             $exit_code = 1;
  46.         }
  47.         
  48.         // 終了コードを明示
  49.         exit($exit_code);
  50.         
  51.     }
  52.     
  53. }




実行してみると、ちゃんと(?)ビルドエラーになりました。

553_05.png



テストを通るように修正して再度実行。

553_06.png


これで自動テストが行えそうです。
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2015/02/19(木) 23:24:01|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Debian 7 ユーザーの追加とsudoでの実行許可 | ホーム | JenkinsとGitBucketを連携し、pushされたら自動的にソースを取得する(GitBucket Plugin)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1633-a03fc789
この記事にトラックバックする(FC2ブログユーザー)