🐶
CakePHP2でTDD テストデータの作成
テストデータ作成についてまとめました。
テストデータの作成
テストデータ生成ではCakePHP2VersionのFabricateというライブラリを使用しています。
CakePHP2既存のFixtureを使わない理由
Fixtureだと、下記のように$recordsに対して連想配列でテストデータを定義します。
UserFixture.php
class UserFixture extends CakeTestFixture
{
public $records = [
[
'id' => 1,
'name' => '名前1',
'age' => 10,
],
[
'id' => 2,
'name' => '名前2',
'age' => 20,
],
[
'id' => 3,
'name' => '名前3',
'age' => 30,
],
];
}
例えば年齢のテストを行いたい時にテストケースの数だけ配列を追加するのですが、age
だけではなく毎回id
やname
も定義していかなくてはいけません。
また、ユーザーテーブルに対して新しいカラムが追加された時に1つ1つ定義をしなおさなければなりませんし、型が変わったりしたらそれまた大変です。
今回は配列が短いので簡単に修正することが可能ですがこれが数十となると...辛いです。
以上の理由からFabricateを使っています。
Fabricateを使ったテストデータ作成
Fabricate::define
を使うことでテストデータの初期値を設定できます。
UserFixture.php
class UserFixture extends CakeTestFixture
{
public function init()
{
parent::init();
Fabricate::define('User', [
'id' => 1,
'name' => '名前1',
'age' => 10,
]);
}
}
設定ができたらテストファイルから使います。
年齢が10以下のユーザーのみ取得するというメソッドをテストするために、年齢が10, 20歳のテストデータを作ります。
UserTest.php
App::uses('Fabricate', 'Fabricate.Lib');
class UserTest extends TestCase {
/** @test */
public function 年齢が10以下のユーザーのみ取得すること()
{
Fabricate::create('User', ['age' => 10,]);
Fabricate::create('User', ['age' => 20,]);
// テスト処理
}
}
このようにFixtureで定義している初期値をオーバーライドすることでテストデータを作成することができます。さらにテストメソッド内部でどのデータを作っているのかひと目でわかるので可読性も上がります。
Discussion