こんにちは! テストコード書いてますかー!
ボクらのサービス「アプリヘルプ」、「ファイナルアイズ」では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でのデータ定義のサンプルです。とってもシンプル。
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() {
// テストコード
}
}
これで、さらにガシガシテストが書けますね!