CakePHPとPHPUnit(訳)

この訳について

CakePHPのコアデベロッパーの中心となる、mark storyがCakePHP2.0のテストのフレームワークSimpleTestからPHPUnitに変更するということについて、経緯とその有用性、移行についての悩みどころについて詳細な記事を書いてくれました。
元記事: http://mark-story.com/posts/view/cakephp-and-phpunit
この訳はその記事の対訳にあたります。

注意点
  • 翻訳の記事をブログに掲載する許可は得ています。
  • 英語力に不安がある人が翻訳してますので、英語が読める方は元記事を読むことを強く推奨します。
  • (一応)個人的な記事ということで、ラフな口語訳をしていますが、割とフォーマルな英文だったので失敗してるかもしれません。許して!

対訳

CakePHP 2.0 の開発が進行中であるということについての最近のBakeryの記事で、既にSimpleTestからPHPUnitへの移行が進められていることが紹介されたよね。この決定についてのいくつかの理由と動機、あと長い目で見たときの利益について説明したくなったんだ。

どうして変えるの?

今現在、CakePHPのテストスイートには15,000以上のassertion*1と650以上のファイルがある。巨大なアプリケーションも簡単にこのような多くのテストケースを持つことができるよね。そんなサイズのコードベースに対する基礎的なテストスイートのフレームワークを変更するのは、ちょっとやそっとじゃいかない。SimpleTestからCakePHPが引越しするのを軽く決めたわけじゃないんだ。僕たちがPHPUnitに移行することを決めることになった理由がいくつかある。以下にそれを示そう。

  • SimpleTestはE_STRICTに準拠してない。これはコードベースをE_STRICT準拠にすることを阻害する。幾千もの警告を切り抜けて問題とすべき箇所を特定するのは難儀な仕事だよね。PHPUnitへの移行によって、読み取るE_STRICT警告が少なくなると同時に、CakePHP自身ののE_STRICT警告を修正することが簡単になる。
  • PHPUnit継続的インテグレーションから自動化のビルドまで、大量の付属のツールを誇っている。これまでツールサポートの蓄積はPHPUnitに遅れをとってきた。そして、この転換によってCakeの開発者が素晴らしいツールのサポートを利用することができるようになるだろう。
  • 今やPHPUnitはテストフレームワークデファクトスタンダードだ。現在、Zend Fremework、Yii、他の数多くのプロジェクトまでもがPHPUnitを使っているよね。SymfonyとDoctrineは次のリリースでPHPUnitに移行することになるし。ブランドとシェアは明らかにPHPUnitが先を行っている。更に、新規開発者が(訳補:PHPUnitを使った)テストの使い方にすでに詳しいこともあるだろうから、CakePHPPHPUnitに引っ越すことで、開発者を楽にできる。
だけど全てのテストがぐしゃぐしゃになっちゃった!

ユニットテストフレームワークを変更することはとても痛みを伴う工程だ。PHPUnitSimpleTestには内部で大きな差異がある。全てのCakePHPのテストをPHPUnitを使うように移行しなければらない。僕たちはこの痛みにとてもよく気づいている。僕たちの狙いは、テストケースがCakeTestCaseを継承さえしていれば、変化に気づくことさえないかもしれない、ということなんだ。僕たちは様々なSimpleTestPHPUnitassertionメソッドの相違を、僕たちができうる範囲でラッピングし適切に動作するように、試行錯誤して確実なものにする予定だ。joze_zapは既にfixtureを移植したんだけど、以前のものとは相違点がないだろうね。一番の大きな問題点はSimpleTestが提供していたMockクラスだ。MockオブジェクトはPHPUnitではかなり異なる実装で、この違いを覆い隠す簡単な方法はない。このようなことについて、移行ガイドにはセクションが設けられ、ユーザが書いたテストをどのように書き直せばいいかをカバーすることになるだろう。

カバレッジの向上

PHPUnitへの移行はコードカバレッジのレポートの作成に莫大な支援をもたらしてくれた。PHPUnitが提供する機能を使えば、コードガバレッジの生成はより早くなり、より多くの情報を提供してもらえる。PHPUnitを用いたコードガバレッジはテストケース中でロードされたすべてのファイルに関して報告するようになった。これでどのファイル・オクジェクトが連動しているかをより完全に捉えることができる。また、PHPUnitテストスイートは特定のコードの行をカバーしているテストメソッドを見つけ出せる機能をもっている。カバーされている行をマウスオーバーすると、どのテストがこの行に対して実行されるかを見ることができる。もちろんこれはtitle属性を正しく扱うブラウザーが必要なんだけどね。

僕はこれは巧みで素晴らしい機能だと思うし、これが示すのはPHPUnitに変更することによっていくつかの改善が得られるであろうということだと思うんだ。アプリケーションをアップグレードするにあたって、この変更は頭の痛くなる点になるだろうということを僕は真に理解している。だけどね、長い目で見れば、これは有益な変更になると思う。より良いツールへアクセスできること、より他のプロジェクトと同じ方式に従ったテスト環境こそが、長期に渡って報われるものとなると僕は感じている。

*1:訳注:意味が分からない人はテストの項目だと思えば良い