fuelphpでunittestを書いてTravisCIで動かしてCoverallsでカバレッジが見れるようになるまで

思い立った

個人で開発をしていて、ちょっとしたツールを作っていました。

 

「個人開発なのに、毎回毎回deployとかしてられねー」という思いから、GithubのwebhookをAPIが受け取ってshellでdeploy、みたいなCDちっくなことはしていました。

CIについては「明日から本気だす」という状態から先に進まなかったんですが、強制的にでも気分転換しないと、アカン...という状況に追い込まれたので思い切ってやってみることにしました。

せっかくなのでいろいろ試したい!と思っていて、最近はやり?の開発を支援するツールたちを使ってみた、というお話です。

unittest ( oil test / phpunit )

言語はPHPフレームワークFuelPHPを選択していました。

FuelPHPではoilという強力なCLIツールがあって、そこからphpunitを使うことが出来るようでした。

$ php oil test

ここで2つ、はまりました。

Response::redirectのexit

fuelphpのコントローラーのテストにおいて、ソース内でリダイレクトしている場合。

通常、Response::redirectを使ってリダイレクト処理を書いていると思いますが、これが内部でexitを読んでいるとのこと。

以下の記事を参考にhookをいれてあげる必要がありました。
(他にもテスト全体的に参考になりました)

fuelPHPでPHPUnitを使ったユニット・コントローラーテストをするには - Qiita

Validation内のinputにおける遅延静的束縛

遅延性的束縛」自体はまだちゃんと理解しきれてないのですが、連続してfuelphpのvalidationのソースコードを通す場合、validation内で使われているinputをリセットしなければならないようでした。

また先ほどの記事にお世話になります。

InputExを追加し、InputEx::reset()を呼ぶことで解決しました。

TravisCIで動かす

無事、oil testでユニットテストが動くようになると、継続的なインテグレーションを求めて、GitHubとの連携をしてみたくなります。

ここで、言葉は知っていましたが手を付けれていなかった、TravisCIと連携してみます。

Travis CI 入門:GitHub + Travis CI で継続的インテグレーション « をぶろぐ

TravisCIの説明から実際に導入するまでが簡潔に書かれています。

 

1点、.travis.ymlの記法が変わったのか、notificationsがvalidationエラーとなってしまったため、いったん以下の記述にしました。

bms/.travis.yml at GitHub

notifications:
  email:
    - tyoshii716+bms@gmail.com

Coverallsでカバレッジが見たい

unittestが自動的に動くようになると、反射的にカバレッジが見たくなります。

「travisci coverage」みたいな検索をすると以下の記事を見つけました。

Travis CIと連携してカバレッジを測定するCoverallsがCandyCaneに炸裂した件 : candycane development blog


Coverallsという名前は初めて聞きました。。さっそくTry。

.coveralls.ymlをよんでくれない

madroom project: Travis CIでPHPUnitを実行して、Coverallsでカバレッジを表示するメモ

この辺りも参考にしながら設定を進めますが、.travis.ciのafter_scriptに書いたcoverallsがうまく行きません。

[Symfony\Component\Config\Definition\Exception\InvalidConfigurationException]

src directory is not found

調べてみると、src_dirに"."を指定するなどいくつか方法が出てきますが解決せず。

 

ソースを読み進めると、coverallsの中で指定されている$rootDir変数が怪しいことがわかりました。

php-coveralls/coveralls at master

coverallsの__DIR__を起点にbootstrap.phpの場所を探し、その場所を起点に$rootDirを決めています。

fuelphpでcomposerを利用してphp-coverallsをインストールした場合、$rootDir変数は$GIT_ROOT/fuel になってしまうことがわかりました。

 

そこで、.coveralls.ymlの内容を以下に修正し

bms/.coveralls.yml at GitHub

src_dir: ..
coverage_clover: ../build/logs/clover.xml
json_path: ../build/logs/coveralls-upload.json

.travis.ymlでcoverallsを呼ぶ際、configオプションを指定するようにしました。

coveralls.yml symlink delete, update travis.yml at GitHub

まとめ

これら開発を支援してくれるツールは他にも多くあり、とても強力だなと思いました。

ですが、その導入・検証に時間がかかる点(TravisCIの実行時間は待たないといけない、クラウド実行なのでデバッグがしづらい、、etc)は気になりました。

これを理由・原因にして「明日からほn・・」という状態になっている人も少なくないんじゃないかな、と自分を肯定してみたりしました:-P