ユニットテスト(2.x系)

2.x系でのユニットテストは1.x系とは違い、PHPUnitを使用するようになりました。
1.x系からのUpgradeShellでは変更してくれないため、独自で書き直す必要があります。
管理者が書き直したときの手順を一番最後に載せています。

PHPUnitの導入

PEARを使用して導入するのが楽だと書かれてあるサイトが多いです。 PEARを使用できるなら、こちらで導入するのがよいと思います。 PEARのインストールについては、ここでは言及しません。

Model

Modelをbakeした場合、app/Test/Case/Modelの下にモデルのテストケースが、 app/Test/Fixtureの下にテスト用のfixtureが作成されます。
Modelのテストケースの場合、クラスの初期化にClassRegistry::init()を使用すると思いますが、 この場合、クラス宣言の前のコメントに「@property [クラス名] $[クラス名]」を加えておくと、 入力補完などが聞いて便利です。(newで初期化する場合は、宣言がなくても入力補完が効きます)

Controller

使用するModelのfixtureを用意した上でControllerのテストのひな形を作成します。 Controllerをbakeした場合、app/Test/Case/Controllerの下にテストケースが作成されます。

Component、Behavior

Component、Behaviorもbake時に独自メソッドがある場合はテストfunctionが作成されます。

Helper

Helperもbake時に独自メソッドがある場合はテストfunctionが作成されます。
ViewがClassRegistryに登録されなくなったなどの変更があるため、setUp()の初期化内容を変更する必要があるのではないかと思います。

Plugins

pluginsフォルダ内のプラグインのフォルダ内にtestsを作成できます。
appと同じ階層にあるプラグインはappのテストページに「Plugins」にプラグインごとに表示され、テストできます。 (テストページは以下のような感じになります)

Pluginのテストを記述する際に気をつけること

Fixturesの記述が以下のようになります
plugin.プラグイン名.モデル名
例:plugin.boo.foo
 プラグイン「Boo」の「foo」モデル

プラグインで定義しているクラスの読み込み
App:userで読み込む場合のタイプにプラグイン名を接頭辞として付加する必要があります。
例:App::uses('Foo', 'Boo.Model');
 プラグイン「Boo」の「foo」モデル
例:App::uses('UooBehavior', 'Boo.Model/Behavior');
 プラグイン「Boo」の「Uoo」ビヘイビア

テストのグループ化

cookbookのテストの項目にあるように、グループ化するには、Caseの直下に以下を記述したファイルを置きます。 この時、(テストのトップページには表示されませんが)1.x系のファイル名も読み込めます。

class AllTestsTest extends CakeTestSuite {
    public static function suite() {
        $suite = new CakeTestSuite('All tests');
        $suite->addTestDirectoryRecursive(TESTS . 'Case');
        return $suite;
    }
}

全てのModelのテストだけを実行した場合は、addTestDirectoryRecursive()に渡すフォルダパスをCase/Modelとすれば、 Model以下のテストファイルのみを実行します。このとき、CakeTestSuiteのコンストラクタに渡す引数名も それなりのもの(All model testsなど)にしたほうがよいと思います。

1.x系のsimpletestから2.x系のPHPUnitへの移行

とはいえ、数が多いと大変です。