CakePHP 1.2の単体テスト作成にはbakeが便利 (前編)
こんにちは。シーブレインのtanakaです。CakePHPは1.2からFixtureの仕組みが取り入れられることは少し前から知っていました。(Fixtureとはテスト用DBの初期データを用意する仕組みのことです。)最近、bakeコマンドによりウィザード形式で単体テストのひな形まで作ってくれることを知ったのでご紹介します。
準備
まず、環境を確認します。プロジェクトフォルダは~/projects/cakeblogにCakePHPのアーカイブを展開したものとし、SimpleTestをvendorsに配置済みとします。bakeは1.2でcakeのサブコマンドになっていますので、まずcakeコマンドへのPATHを設定します。(Debian GNU/Linuxでzshの場合)
export PATH=$PATH:~/projects/cakeblog/cake/console/
% cake
Welcome to CakePHP v1.2.1.8004 Console
---------------------------------------------------------------
Current Paths:
-app: cakeblog
-working: /home/ktanaka/projects/cakeblog
-root: /home/ktanaka/projects
-core: /home/ktanaka/projects/cakeblog
#...
データベースの設定
データベースは開発用とテスト用に2つ用意し、それぞれ権限を割り当てます。パスワードは適宜読み替えてください。(MySQLコンソールで作業)
CREATE DATABASE cakeblog DEFAULT CHARACTER SET utf8;
CREATE DATABASE cakeblog_test DEFAULT CHARACTER SET utf8;
CREATE USER cakeblog@localhost IDENTIFIED BY '*********';
GRANT SELECT , INSERT , UPDATE , DELETE ON cakeblog . * TO cakeblog@localhost;
GRANT ALL PRIVILEGES ON `cakeblog\_test` . * TO cakeblog@localhost WITH GRANT OPTION ;
FLUSH PRIVILEGES ;
CREATE TABLE cakeblog.entries (
id int( 11 ) NOT NULL ,
title varchar( 255 ) COLLATE utf8_unicode_ci NOT NULL ,
body text COLLATE utf8_unicode_ci NOT NULL ,
created datetime NOT NULL ,
modified datetime NOT NULL ,
PRIMARY KEY ( id )
);
bake
データベースを作り、権限を割当てました。(テスト用DBにはテーブル作成もできるようにします。)そして、サンプルの為のテーブルを作成しました。さて、bakeの始まりです。
% cd ~/projects/cakeblog/app
% cake bake
#...
#...(省略)
What would you like to Bake? (D/M/V/C/P/Q)
> M
ここではモデルのコードを生成してみましょう。M<Enter>と入力します。
---------------------------------------------------------------
Bake ModelPath: /home/ktanaka/projects/cakeblog/app/models/
---------------------------------------------------------------
Use Database Config: (default/test)
[default] > <Enter>
defaultでいいのでEnterです
Possible Models based on your current database:
1. Entry
Enter a number from the list above, type in the name of another model, or 'q' to exit
[q] > 1<Enter>
先ほど作ったテーブルから、作成するモデルの候補が表示されますので、1を押してEnterです。
Would you like to supply validation criteria for the fields in your model? (y/n)
[y] > n<Enter>
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n)
[y] > n<Enter>
バリデーションとアソシエーションを設定するか聞かれるのでnで進みます。
---------------------------------------------------------------
The following Model will be created:
---------------------------------------------------------------
Name: Entry
Associations:
---------------------------------------------------------------
Look okay? (y/n)
[y] > <Enter>
Baking model class for Entry...
Creating file /home/ktanaka/projects/cakeblog/app/models/entry.php
Wrote /home/ktanaka/projects/cakeblog/app/models/entry.php
Baking test fixture for Entry...
Creating file /home/ktanaka/projects/cakeblog/app/tests/fixtures/entry_fixture.php
Wrote /home/ktanaka/projects/cakeblog/app/tests/fixtures/entry_fixture.php
Baking unit test for Entry...
Creating file /home/ktanaka/projects/cakeblog/app/tests/cases/models/entry.test.php
Wrote /home/ktanaka/projects/cakeblog/app/tests/cases/models/entry.test.php
ずらずらとメッセージが表示されました。ここではEntryモデルとFixture、ユニットテストのひな形がファイルに保存されたことが表示されています。
自動生成されたテストを実行
さて、ここでやっとブラウザの登場です。/test.phpをまず開いてください。自動テストのインデックスページが表示されます。次にAppのTestCasesを開くと、「models / Entry」と表示されます。先ほど生成したユニットテストの情報が表示されました。これをクリックすると、「1/1 test cases complete: 3 passes, 0 fails and 0 exceptions.」と表示されます。自動生成されたテストが実行された証です。
さて、テストされたといっても作るべきアプリケーションのテストにはなっていません(ここではブログアプリと仮定します)ので、仕事がすすんだわけではありません。しかし、Modelはともかく、FixtureやUnitTestのひな形を用意する手間は減らせると思います。また、テストコードのサンプルが生成済みなので、そのソースコードを読めばテストの書き方も学ぶことができます。
まとめ
cakeサブコマンドのbakeを使って、モデル、Fixture、ユニットテストのひな形を生成しました。今回はエントリーが長くなってしまったので、ここで終わりとします。次回は生成したコードに変更を加えて、中身を理解していきたいと思います。
参考文献
Bake でコード生成する :: コアコンソールアプリケーション :: マニュアル :: 1.2 Collection :: The Cookbook追記 2009/03/04
CakePHP 1.2の単体テスト作成にはbakeが便利 (後編)、公開しました。お待たせして済みません。