🐶

CakePHP2でTDD テストデータの作成

2022/01/25に公開

テストデータ作成についてまとめました。

テストデータの作成

テストデータ生成では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だけではなく毎回idnameも定義していかなくてはいけません。
また、ユーザーテーブルに対して新しいカラムが追加された時に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