candycane

先日告知したCandyCaneの開発会が無事に執り行われました。参加者の皆様にはCandyCaneの特製パーカーと肉たくさんカレーを進呈させていただきました。Hamacoさんの動きっぷりにイベントの盛況さが現れています。

丸一日のTDDは強烈な成果

Pulse · yandod_candycane
今回は新しく開発に加わってもらう方を募るという事も兼ねて、ユニットテストを厚くするという作業を中心に丸一日の開発を行いました。よって1日で20以上のプルリクエストをマージしましたが、昨日は何も増えていません。とはいえ実際に稼働するアプリケーションのソースコードにテストを書き、プリリクエストとCIを併用したチーム開発を行うという内容は実にチャレンジでTDD未経験の方にとっても実りある内容になったようです。

Travis CIは最強

cc

コミットがプッシュされる度に自動的にユニットテストを実行して結果をレポートしてくれるTravis CIですがやはり便利です。もちろんCandyCaneでも利用しています。特にオープンソースプロジェクトでは気になるPHPの各バージョンや各DBとの組み合わせでのテスト実行も自動的に行なってくれるのは驚異的です。CI環境を自力で構築する手間を考えると本当にありがたいサービスです。またPHPがバージョンアップの度に動作速度が早くなり、テストにかかる時間が短くなっていくのも体感できる点も面白いですね。もしあなたのプロジェクトがユニットテストを実行できる状態になっているのであれば、.travis.ymlを記述するだけでTravis上でのビルドを実行できます。例えばCandyCaneで使っているtravis.ymlを抜粋すると下記のような感じです。

language: php

php:
#  - 5.2 # travis doesn't suppport php5.2 with open_ssl
  - 5.3
  - 5.4
  - 5.5

env:
  - DB=mysql
#  - DB=pgsql
#  - DB=sqlite

before_script:
  - curl -s http://getcomposer.org/installer | php
  - php composer.phar install --dev --no-interaction
  - sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'CREATE DATABASE cakephp_test;'; fi"
  - chmod -R 777 ./app/tmp
  - echo " app/Config/database.php
  - mysql cakephp_test < app/Config/sql/mysql.sql
script:
  - cd ./app; ./Console/cake test app All --stderr
  - cd ../

基本的にlanguageとバージョン、データベースを設定すればテスト環境の設定をbefore_script、テストの実行をscriptにシェルスクリプト的に記述するだけです。AntやPhingを使っている場合はさらに記述をシンプルに出来ますが特に設定が困難な部分は無いと言ってよいでしょう。設定が済むとGitHub上でプルリクエストを受けた場合にそのプルリクエストがテストを通るかどうかなどが各プルリクエストのページに自動で埋め込まれるようになり、マージ作業前に手動でテスト実行する必要がなくなります。これは産業革命レベルで作業効率が上がりますのでオープンソースプロジェクトであれば必ず導入するべきだと思います。

Coverallsを使えばPHPプロジェクトだってカバレッジが見れちゃう

cover

Travisの欠点はカバレッジレポートの公開が出来ない事、しかしその欠点を補うサービス Coverallsが始まりさらにPHP用のライブラリをsatooshi_jpさんが公開しています。このライブラリをCandyCaneがComposer対応した事もあって組み込んだ結果がこのレポートです。うおおおおおお!!!

Satooshiさんの対応は神レベル

https://twitter.com/satooshi_jp/status/328518418917642240
当初、組み込んでみた所うまくレポートが生成されないという問題がありました。最終的にはテスト実行時のカレントディレクトリや相対パスの記述などが原因だったわけなのですがなんとこの辺りの問題を察知してSatooshiさんが直してプルリクを送ってくれました。

このライブラリは神レベルなので全PHPerは是非GitHubでスターしましょう。
satooshi/php-coveralls · GitHub

実際にCandyCaneで生成しているTravis CIとCoverallsのレポートを見るともう普通に業務で利用しているCIサーバと遜色の無いレベルなのがわかると思います。またCIサーバはメモリ不足でのダウンやら環境のトラブルが発生しやすいので独自での構築を行う努力を止めて、外部サービスに全力で移行すべきだと思います。CIサーバの構築と運用に費やした労力って多くの場合エンドユーザにはなんのメリットにもならないですからね。プライベートリポジトリを対象にしたレポートやテストについてもあまりお金を掛けずに実行可能ですので、GitHubを業務に活用する流れの次の段階はTravisなどのツールの活用ではないでしょうか。