CakePHP2.4+WindowsでPHPUnitを使えるようにするまでの手順

Pocket

cakephp

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でテストしようとしても

Warning (2): include(PHPUnit/Autoload.php): failed to open stream: No such file or directory [CORE/Cake/TestSuite/CakeTestSuiteDispatcher.php, line 146]

みたいなのが出てきた挙句に「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をインストールしてた時となるべく同じにしたかったので、少しプラスしたアプリケーションも入れています。

http://pear.phpunit.de/

  • 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のパスが通ってる場所ならどこでも大丈夫です)

多分こんな感じになるはず。

[PHPディレクトリ内]
includes
├File
├lib
├PHP
├PHPUnit
├Text
├phpcov.bat
├phpcov.php
├phpunit.bat
└phpunit.php

最後、php.iniのinclude_pathincludesディレクトリが入ってるか確認します。

うまくいけば、これでテストできるはず。

CakePHP2.4+WindowsでPHPUnitを使えるようにするまでの手順” への3件のコメント

  1. 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’;

    • そうだったんですか、わざわざあんなことしなくてもかなり簡単にできたんですね。
      情報ありがとうございます!

  2. ピンバック: CakePHP ユニットテスト | ozakingblog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です