LoginSignup
19
20

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-11-21

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

ボクらのサービス「アプリヘルプ」「ファイナルアイズ」では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() {
        // テストコード
    }
}

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

19
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
20