YAMLならDBのテストデータ作成はこんなに簡単! with FuelPHP

More than 3 years have passed since last update.

こんにちは! テストコード書いてますかー!

ボクらのサービス「アプリヘルプ」「ファイナルアイズ」ではFuelPHPを使ってテストコードをガシガシ書いているのですが、テストのためのデータベースのデータを用意するのって面倒ですよね。

その際によく使われるのは昔ながらのDBUnit系のツールでしょうか。最近のフレームワークを使っているのであれば、便利なテキストフォーマット変換のクラスが用意されているので、それを活用すると簡単にテストデータを記述することができちゃいます。


Format クラスを活用

FuelPHP の Format クラスを使うと JSON や YAML、XML、php array などに相互変換できます。これを利用して YAML でテストデータを定義してDBへインサートすることが可能です。

なぜ YAML かって? 記述が楽だからです。XMLみたいにタグもいらないですし、JSONのようにクォーテーションの記述も不要です。

参考)FuelPHP の Formatクラス

http://fuelphp.jp/docs/1.7/classes/format.html


YAMLのデータ定義

YAMLでのデータ定義のサンプルです。とってもシンプル。


sample.yml

company:

- id: 1
name: 海山商事
address: 東京都渋谷区渋谷1-1-1
tel: 03-1111-1111
created_user: 99

employee:
- id: 1
company_id: 1
name: 磯山マスオ
age: 30
created_user: 99

- id: 2
company_id: 1
name: 磯山サザエ
age: 30
created_user: 99



TestCaseを拡張

TestCase を拡張して YAML をインサートするメソッドを用意しましょう。


テストクラスの親クラス

use Fuel\Core\DB;

use Fuel\Core\TestCase;
use Fuel\Core\Format;

class UnitTestCase extends TestCase {

public function setUp() {
DB::start_transaction();
}

public function tearDown() {
DB::rollback_transaction();
}

/**
* 指定したファイルのデータをデータベースへ登録します。
*
* @param string $yaml_filepath yamlフォーマットで記載したデータファイル名
*/

public static function initializeData($yaml_filepath) {
$data = file_get_contents($yaml_filepath);
$tables = Format::forge($data, 'yaml')->to_array();

// データの挿入
foreach (array_keys($tables) as $table_name) {
$rows = $tables[$table_name];

foreach ($rows as $row) {
try {
DB::insert($table_name)->set($row)->execute();
}
catch (Exception $e) {
DB::rollback_transaction();
throw $e;
}
}
}
}
}



テストクラス

こちらが実際にテストを記述するテストクラス。


テストクラス


class SampleUnitTest extends UnitTestCase {

public function setUp() {
parent::setUp();

// テストデータ登録。YAMLファイルをフルパスで指定。
parent::initializeData(APPPATH . '/sample.yml');
}

/**
* @test
*/

public function hoge() {
// テストコード
}
}


これで、さらにガシガシテストが書けますね!