cloned.log

2015-12-03 (Thu) Symfonyから手早くYAMLのFixtureを読み込めるAliceFixturesBundle このエントリーを含むブックマーク このエントリーのブックマークコメント

この記事は Symfony Advent Calendar 2015 の4日目の記事です。

開発環境向けのテストデータ(Fixture)作成は hautelook/AliceBundle を使えば便利だけど、テストコードからFixtureを読み込もうとすると一手間かかるので、何かないものかと探したところ h4cc/AliceFixturesBundle に出会った話。

データベースを利用したテストコードを書く場合、テストデータの準備が必要になることが多い。 「テストコードを書く労力を減らす」「テストコードの見通しを良くする」という観点から、テストコードのためのデータ準備は極力簡単にしたいところ。

Symfony + Doctrineを利用している場合に真っ先に選択肢に上がるものとして DoctrineFixturesBundle があるけれど、見ての通りFixture自体がPHPコードであり、テストデータの準備に苦労が絶えない。

そこで登場するのが nelmio/alice を利用できる hautelook/AliceBundle で、これについては去年の Symfony Advent Calendar 2014 の記事である [Symfony] AliceBundleで自動テストのfixtureをyml化しよう が詳しい。すごくわかりやすいのでご一読を。

どういうYAMLになるかというとこういう感じ。

AppBundle\Entity\User:
    user{1..10}:
        username: <username()>
        fullname: <firstName()> <lastName()>
        birthDate: <date()>
        email: <email()>
        favoriteNumber: 50%? <numberBetween(1, 200)>

これで10件のuserが作成され、それぞれにFakerを利用したランダムな名前や誕生日、メールアドレスなどが設定される。

PHPコードでテストデータを用意する苦労からは解放されたものの、まだ面倒な点があり、先に紹介した [Symfony] AliceBundleで自動テストのfixtureをyml化しよう から引用させていただくと、

<?php
$this->loadFixtures(
    array(
        new UserFixtureLoader(),
    )
);

このように一つのFixtureごとにPHPのクラス(ここではUserFixtureLoaderのこと)を作らなければならない。これは結構面倒だ。

それで色々と探していたところ h4cc/AliceFixturesBundle を発見した。DoctrineFixturesBundle に依存しないため、より簡潔なFixtureの読み込みを実現している。

具体的な実装はデモのテストコード、AliceDemo/src/h4cc/AliceDemoBundle/Tests/Controller/UserControllerTest.php を見るとわかりやすい。

抜粋すると、

<?php
public static function setUpBeforeClass()
{
    $client = static::createClient();
    $manager = $client->getContainer()->get('h4cc_alice_fixtures.manager');
    static::$fixtures = $manager->loadFiles(array(__DIR__ . '/DataFixtures/Alice/alice.yml'));
    $manager->persist(static::$fixtures);
}

こういう感じで直接AliceのYAMLを指定するだけとなっており、Loaderクラスを作成する必要がなく大変便利。

ということで、 h4cc/AliceFixturesBundle の紹介でした。なんと Symfony Advent Calendar 2015 の次の日、12/5はまだ空いているので、どなたかよろしくお願いします!