Perlでカジュアルに単体テストのフィクスチャを扱う
PerlでDBを使った単体テストを行う時は
Test::mysqldや
Harrietを使ってDBのプロセスを立ち上げたりしているのですが、
テスト毎にフィクスチャを定義するカジュアルなやり方がないなーと感じてました。
そこで__DATA__
セクションにSQLをそのまま書きフィクスチャデータとして扱える
Data::Section::Fixtureというモジュールを作ったので紹介します。
インストール
$ cpanm Data::Section::Fixture
使い方
まず以下のサンプルコードのように、テストの__DATA__
セクションにsetupとteardown用のSQLをベタ書きします。
このSQLはwith_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
が呼ばれるたびにフィクスチャデータはリフレッシュされるので、他のテストの影響を受けることなく各テストを実行できて便利です。
おわりに
各テストが安心・安全にフィクスチャを扱えるモジュールの紹介でした。ガンガン単体テストを書いていきましょう。