CakePHPでSimpleTest その2 TestSuiteの動きをモデルのテストケースのスケルトンで確認
2008/07/18 タイトルのスペルが間違っていたので、訂正
CakePHP1.2でbakeしている人のための簡単SimpleTest その1 の続きです。
bakeで作成されたモデルのテストケースの確認
app/test/cases/models/user.test.php
PHP:
<?php App::import('Model', 'User'); class TestUser extends User { var $cacheSources = false; var $useDbConfig = 'test_suite'; } class UserTestCase extends CakeTestCase { var $User = null; function start() { parent::start(); $this->User = new TestUser(); } function testUserInstance() { } function testUserFind() { $results = $this->User->recursive = -1; $results = $this->User->find('first'); 'id' => 1, 'username' => 'Lorem ipsum dolor sit amet', 'password' => 'Lorem ipsum dolor sit amet', 'flag' => 1, 'created' => '2008-06-17 19:41:18', 'modified' => '2008-06-17 19:41:18' )); $this->assertEqual($results, $expected); } }
2行目の
App::import('Model', 'User');
でテストを行うモデルの読み込み
6行目の
var $useDbConfig = 'test_suite';
で、使われるテーブルのプレフィックスがtest_suiteになります。
DBは同じです。
意図的に違うDBにしたい場合は、database.phpに定義したものを使うことができます。
例えばvar $useDbConfig = 'test';
今回は、本番用のテーブルからテスト用のテーブルにデータをコピーするしたいので、
var $useDbConfig = 'test_suite';のままでいきます。
11行目の
var $fixtures = array('app.user');
ですが、「app」,「指定しない」,「core」,「plugin」があるようです。
通常使うのは、「app」、「指定しない」だと思いますが、普通にテストケースを作成する分には、どちらでもいい気がします。
coreはcakeのコアのテストケースの時に使うようです。
| 指定の仕方の例 | 検索順 | |
| app | app.user | app\tests\fixtures →vendors\tests\fixtures |
| 指定しない | user | app\tests\fixtures →vendors\tests\fixtures →cake\tests\fixtures |
| plugin | plugin.プラグイン名.user | app\plugins\プラグイン名\tests\fixture →app\tests\fixtures →vendors\tests\fixtures |
| core | cake.user | cake\tests\fixtures |
(詳しくはcake/test/lib/cake_test_case.phpを参照)
13行目のstart
SimpleTestに用意にされているのは、おなじみの setUp、tearDownなのですが、
cakeの方では、これ以外に沢山用意されています。
まとめたのが下表
| ユーザ | startCase | 全てのテストケースより先に実行される | |
| ユーザ | endCase | 全てのテストケースの後に実行される | |
| ユーザ | startTest | 各テストケースより先に実行される | |
| ユーザ | endTest | 各テストケースの一番最後に実行される | |
| システム | start | startCaseより先に実行される | fixureでセットしたテスト用のテーブルのdrop、createなど |
| システム | end | endCaseの後に実行される | テーブルのdropなど |
| ユーザ | setUp | 各テストケース前に実行される | |
| ユーザ | tearDown | 各テストケース後に実行される | |
| システム | before | setUpの更に前に実行される | fixureのイニシャライズ(DBの設定)、データのインサートなど |
| システム | after | tearDownの後に実行される | テーブルをTRUNCATEなど |
わからづらいので、作成されたスケルトンの動きをトレースするとこんな感じ
テスト用のテーブルが自動的に作成されたり、データを突っ込んだりする様子がわかります
1.before(fixure、DBのイニシャライズ) → setup → start(テーブルのDrop/Create) → tearDown → after
2.before → setup → startCase→ tearDown → after(テーブルをTRUNCATE)
3.before(データをINSERT) → startTest → setup → testUserInstance → tearDown → after(テーブルをTRUNCATE) → endTest
4.before(データをINSERT) → startTest → setup → testUserFind → tearDown → after(テーブルをTRUNCATE) → endTest
5.before(データをINSERT) → setup → endCase→ tearDown → after(テーブルをTRUNCATE)
6.before() → setup → end(テーブルのDrop) → tearDown → after
endTestは実行される時は、afterよりも後だということに注意。
setUp、tearDown、startTest、endTestの使い分け
通常通り、setUpは各テストケースの初期化、、tearDownは各テストケースの後処理でいいと思います。
startTest、endTestをどうするのか?
http://book.cakephp.org/ja/view/160/testing#creating-a-test-case-367
の例にならって以下のソースを足すと、
-
function startCase() {
-
echo '
-
<h1>Starting Test Case</h1>
-
';
-
}
-
function endCase() {
-
echo '
-
<h1>Ending Test Case</h1>
-
';
-
}
-
function startTest($method) {
-
echo '
-
<h3>Starting method ' . $method . '</h3>
-
';
-
}
-
function endTest($method) {
-
echo '
-
<hr />';
-
}
-
function setUp() {
-
echo '
-
setup
-
';
-
}
-
function tearDown() {
-
echo '
-
teardown
-
';
-
}
各テストケースの実行結果を見やすくと言ったところ?
なんかいい使い道が他にあれば教えてください。
オススメ書籍
Technoteの中の人が執筆に携わった「Webアプリケーションテスト手法」がもうすぐ発売です。
目次を見る限りでは、期待大。SimpleTestだけなく、Seleniumを用いたブラウザ上でのテストやスケーラビリティのテストなんかもあるみたいです。
とはいっても、2008/7/25発売なので、現時点では、見ることはできません。
SimpleTestのまとまった情報源としては、
http://simpletest.org/en/unit_test_documentation.html
英語以外では、WEB+DB PRESS Vol.29がオススメです。
完売みたいなのですが、WEB+DB PRESS 総集編 [Vol.1~36] があります。
他の記事も読めて、お得感タップリ。Seleniumの特集もVol.36にあります。
CakePHP + SimpleTestなら
http://book.cakephp.org/ja/view/160/testing
http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite
http://my.opera.com/sizuhiko/blog/2008/06/28/cake-test
http://blog.takeda-soft.jp/blog/show/186
http://www.straighten.jp/p/6
http://d.hatena.ne.jp/s-yo-ko/20080328
http://www.syuhari.jp/blog/archives/429
あたりがオススメです。
関連エントリ
CakePHPでSimpleTest その3 モデルのテストケース作成
CakePHP1.2でbakeしている人のための簡単SimpleTest その1
Popularity: 100 %
by redgasuki 













zkaf0zxtullz84wg
で