Perlでカジュアルに単体テストのフィクスチャを扱う

PerlでDBを使った単体テストを行う時は Test::mysqldHarrietを使ってDBのプロセスを立ち上げたりしているのですが、 テスト毎にフィクスチャを定義するカジュアルなやり方がないなーと感じてました。 そこで__DATA__セクションにSQLをそのまま書きフィクスチャデータとして扱える Data::Section::Fixtureというモジュールを作ったので紹介します。

Data::Section::Fixture

インストール

$ cpanm Data::Section::Fixture

使い方

まず以下のサンプルコードのように、テストの__DATA__セクションにsetupとteardown用のSQLをベタ書きします。 このSQLwith_fixture関数に渡したコードが実行される前と後に呼ばれて、フィクスチャをセットアップすることができます。 あとはテスト本体でwith_fixtureを使うと、その関数の中だけフィクスチャデータにアクセスできるようになります。

use Test::More;
use DBI;
use Data::Section::Fixture qw(with_fixture);

my $dbh = DBI->connect('dbi:mysql:test', 'root', '');

subtest 'get all data' => sub {
    with_fixture($dbh, sub {
        my $rows = get_all_from_db();
        is_deeply $rows, [1, 2, 3];
    });
};

subtest 'delete all data' => sub {
    with_fixture($dbh, sub {
        delete_all_from_db();
        my $rows = get_all_from_db();
        is_deeply $rows, [];
    });
};

__DATA__
@@ setup
CREATE TABLE t (a int);
INSERT INTO t (a) VALUES (1), (2), (3);

@@ teardown
DROP TABLE t;

ちなみにwith_fixtureが呼ばれるたびにフィクスチャデータはリフレッシュされるので、他のテストの影響を受けることなく各テストを実行できて便利です。

おわりに

各テストが安心・安全にフィクスチャを扱えるモジュールの紹介でした。ガンガン単体テストを書いていきましょう。