2014年3月現在、PHPフレームワークではFuelPHPがとっても熱いそうですけど、それは置いといてCakePHPでUnitTestをしようとした際にしばらくハマったんで、対処方法をメモしときます。
もしかしたらちゃんとしたインストーラを使ってないからハマったのかもしれないし、本来はもっと簡単にUnitTestできるのかもしれないですけど。
現在構築しようとしてる環境
とりあえずまずは構築しようとしてる環境を。
- Apache2.2
- PHP5.3
- CakePHP2.4.6
- Windows7
なお、Apache2.2とPHP5.3は、インストーラを使わずにZipファイルから手動でインストールしました。ProgramFiles上に入れるのが嫌だったのでどちらもCドライブ直下に置いてます(パスは通してあり、Apacheはサービスに登録済)。
CakePHPでUnitTestを行うまで(本来の手順)
一応本来の手順も簡単に載せておきます。
CakePHPはPHPUnitを使ってのユニットテストが行えます。だから、CakePHPの構築が済んでいれば、あとはPHPUnitをインストールすれば使えます(のはずなんです)。
PHPUnitの簡単なインストール方法は、PEARを使います。
$>pear upgrade PEAR $>pear config-set auto_discover 1 $>pear install pear.phpunit.de/PHPUnit
これで、あとは自動でPHPUnitがインストールされます。
これはCakePHPのドキュメントにも書かれているちゃんとしたやり方のようです。
あとはテスト用のクラスを作って「/app/Test/」フォルダ内のそれぞれルールに沿った場所に配置し、以下のようにURLを叩けば、ブラウザ上からでもテストが可能の手はずです。
「http://【CakePHPのURL】/test.php1」
とっても簡単ですね。
だけどそれだとできなかった
そう、それだとできなかったです(´・ω・`)
ちゃんとインストールもされ、コマンドプロンプトからphpunitが起動するのも確認したのですが、いざCakePHPでテストしようとしても
みたいなのが出てきた挙句に「PHPUnitがインストールできてないぞこら」みたいに言われ、中断しちゃいます。
そもそもPHPUnit/Autoload.phpがない
なぜそんなことになっちゃうかというと、そもそもないわけです。Autoload.phpが。
pearでインストールするとPHPUnitの最新版(2014年3月現在:PHPUnit4.0)がインストールされるのですが、最新版はディレクトリの作成などがされないみたい。代わりにphpunitというファイルが作成され、その中に全てがjarファイルのように入ってます。とまあ、そんな作りに代わってます。
PHPUnit本家にも互換性のあるファイルが見当たらない。
どうものこの「phpunit」ファイル、pharファイルと呼ばれるjarのPHP版があるのですが、それそのものみたいです。
jarファイルと同じようなものだから、展開だってできます。そして展開するとディレクトリがずらずらと作られます。
そしてまあ、ないわけですね。展開しても、Autoload.phpなんて。
そもそももうpharになってるから「include “PHPUnit.phar”」としてくれたらいいんだけど、CakePHP2.4ではなってないわけですね。以前のやり方で、phpファイルを使ってインクルードしようとしています。要は互換性がないっぽい。
PHPUnitは、バージョン3.6まではそのAutoload.phpでずらずらとロードしていく従来の方法を採用してたみたいなんだけど、3.7からはpharでやるように変わりました。
だからまあ、PHPUnit3.6をインストールしないといけないみたいなんですが、本家に行くともうありませんでした(´・ω・`)
というわけで、手動でダウンロードして構築
ないのだから仕方ないですよね。手動であちこちからダウンロードして作るしかないのかもです。
やり方は下記のブログを参考にしました。
CakePHPでPHPUnitを手動インストールしたときのメモ – ミラボ
それぞれ落として解凍
落とすアプリケーションのリストは参考にしたサイトのとほぼ同じです。
あとはPEARでPHPUnit3.6をインストールしてた時となるべく同じにしたかったので、少しプラスしたアプリケーションも入れています。
- PHPUnit(3.6.12)
- File_Iterator(1.3.1)
- PHP_CodeCoverage(1.1.3)
- PHP_TokenStream(1.1.3)
- Text_Template(1.1.1)
- PHP_Timer(1.0.2)
- PHPUnit_MockObject(1.1.1)
http://pear.symfony-project.com/
- YAML(1.0.6)
解凍ソフトはぼくはLhasaが好きですけど、tgzが解凍できればなんでもいいです。
PHPのディレクトリ内にincludesディレクトリを作り、全部ぶっこんでいく
あとは解凍したものをどんどん入れていきます。
tgzファイルを解凍すると、解凍したファイル名のディレクトリの中(たとえばPHPUnit-3.6.12とか)にディレクトリやファイルが存在してるんで、それらを全部includesディレクトリにぶっこんでいきます。
(ディレクトリは、includesじゃなくてもphpのパスが通ってる場所ならどこでも大丈夫です)
多分こんな感じになるはず。
includes
├File
├lib
├PHP
├PHPUnit
├Text
├phpcov.bat
├phpcov.php
├phpunit.bat
└phpunit.php
最後、php.iniのinclude_pathにincludesディレクトリが入ってるか確認します。
うまくいけば、これでテストできるはず。
cakePHPの2.4.6 なら、cakeのRootで
composer updateを行うと、composer.jsonに
“require-dev”: {
“phpunit/phpunit”: “3.7.*”,
“cakephp/debug_kit” : “2.2.*”
}
と書いてありますので、phpunit 3.7系の最新がvendorにダウンロードされます。
あとは {app}/Config/bootstrap.phpの先頭にconposerのautoload.phpをrequireしてあげるだけで動きますよ。
//require ROOT . DIRECTORY_SEPARATOR . ‘vendor’. DIRECTORY_SEPARATOR .’autoload.php’;
そうだったんですか、わざわざあんなことしなくてもかなり簡単にできたんですね。
情報ありがとうございます!
ピンバック: CakePHP ユニットテスト | ozakingblog