SQLiteを使ったテストのtips

DB周りのモジュールを開発している場合、テストDBにSQLiteを使う事が良くあります。

その際、普通であれば以下のようなテストコードを書くと思います

use Test::More tests => 1;
use DBI;
do {
    # SQLiteで使うファイルを指定
    my $dbh = DBI->connect('dbi:SQLite:./test.db','','');
    $dbh->do(q{CREATE TABLE foo (id INT, name TEXT)});
    $dbh->do(q{INSERT INTO foo (id, name) VALUES (10,'nekokak')});

    my $sth = $dbh->prepare('SELECT * FROM foo');
    $sth->execute;
    my $row = $sth->fetchrow_hashref();
    ok $row;
    # 後始末としてファイルを削除
    unlink './test.db';
};

しかし、エラーが発生した場合、最後のunlinkが実行されずに、test.dbファイルが残ってしまい、 テストスクリプトを再度実行すると、CREATE TABLEの部分でエラーが発生してしまいます。

SQLiteではファイル名を指定しない場合、ファイルを作らずオンメモリで処理できるので、 テストコードを書く際はファイルを指定しないようにすると良いでしょう。

use Test::More tests => 1;
use DBI;
do {
    # SQLiteで使うファイルを指定せずオンメモリで処理
    my $dbh = DBI->connect('dbi:SQLite:','','');
    $dbh->do(q{CREATE TABLE foo (id INT, name TEXT)});
    $dbh->do(q{INSERT INTO foo (id, name) VALUES (10,'nekokak')});

    my $sth = $dbh->prepare('SELECT * FROM foo');
    $sth->execute;
    my $row = $sth->fetchrow_hashref();
    ok $row;
};

このようにファイルを指定せずに書けば、unlinkも必要なく、ゴミファイルが残る心配もありませんね。

次は zigorou さん。