2009年7月12日日曜日

CakePHPでユニットテスト

CakePHPでユニットテストする場合、標準ではPHPUnitではなくSimpleTestを使う。


1. ダウンロード
SimpleTestはDownloading SimpleTestからtar.gzをダウンロードできる。
(なぜかSoureceForgeの方からはtar.gzがダウンロードできなかった。どうでもいいが上記のページには"... from SourceForget.net ..."と書いてある。ソースのことなど忘れたい...とか?)


2. セットアップ
基本的にCakePHP1.2の本家のリファレンスに沿って進めればセットアップできる。


3. setUp, tearDown
SimpleTestではxUnitと同様にsetUp() tearDown()が使えて、さらにそれに加えていろいろなタイミングで呼ばれるfunctionがあるらしい。
参考:CakePHPでSimpleTest その2 TestSuiteの動きをモデルのテストケースのスケルトンで確認 | ねねとまつの小部屋

<?php
//app/tests/cases/models/member.test.phpの例
App::import('Model', 'Member');

class MemberTestCase extends CakeTestCase {

 function setUp() {
  $this->Member =& ClassRegistry::init('Member');
 }

 function testHoge() {
  $result = $this->Member->hoge('foo');
  $expected = array('baz' => 'bar');
  $this->assertIdentical($result, $expected);
 }
}


4. assert
assertEqual()は"=="で比較するので危険らしい。常にassertIdentical()を使った方が良さそうだ。


5. Caverrage
"Analyze Code Coverage"を見るにはxdebugが必要らしい。


6. Controllerのテスト
$this->testAction()が使える
<?php
class MembersControllerTest extends CakeTestCase {
 function startCase() {
  echo '<h1>テストケースを開始します</h1>';
 }
 function endCase() {
  echo '<h1>テストケースを終了します</h1>';
 }
 function startTest($method) {
  echo '<h3>メソッド「' . $method . '」を開始します</h3>';
 }
 function endTest($method) {
  echo '<hr />';
 }
 //普通に呼び出す
 function testIndex() {
  $result = $this->testAction('/');

}
 //レンダリングしたHTMLを取得する
 function testIndexGetRenderedHtml() {
  $result = $this->testAction('/', array('return' => 'render'));
  //表示して確認
  debug(htmlentities($result));
 }
 //コントローラ内でセットしたデータを取得する
 function testIndexGetViewVars() {
  $result = $this->testAction('/', array('return' => 'vars'));
  $this->assertIdentical($result['fuga'], 'honyarara');
  //表示して確認
  debug($result);
 }
}

参考:コントローラのテスト :: テスト(Testing) :: CakePHPによる作業の定石 :: マニュアル :: 1.2 Collection :: The Cookbook

0 件のコメント:

ブログ アーカイブ

tags