ユニットテスト(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」にプラグインごとに表示され、テストできます。
(テストページは以下のような感じになります)
- App
- Tests
- Plugins
- Boo
- Tests
- Boo
- Core
- Tests
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への移行
- ファイルを置くフォルダの変更
1.x系はtestsフォルダ以下にべた置き。
2.x系はapp以下と同じ階層構造。 - ファイル名の変更
1.x系はアンダーバー記法のクラス名からタイプを省いたもの.test.php
2.x系はクラス名 + Test.php - インポートファイル(App::uses()やApp::import()で読み込んでいるファイル)の記述の修正
引数の記述方法が若干異なっています。 - startTest()、endTest()メソッドをsetUp()、tearDown()メソッドへ変更する
このとき、setUp()の最初、tearDown()最後で、それぞれの親メソッドを呼び出すように修正します。 CakeTestCase::tearDown()内でClassRegistry::flush()を呼んでいるので、 ClassRegistry::flush()の記述がある場合は消してくください。 - assertTrue()など一部のアサートメソッドが使用できません。
とはいえ、数が多いと大変です。