App::Prove::Plugin::HarrietでTest::mysqldを起動する

perlのtestと言えば、proveなんですけど、-Pのオプションでプラグインを追加できて、その中でも、
App::Prove::Plugin::Harrietが結構便利です。

素の状態で実行するならこんな感じ。

carton exec -- prove -PHarriet=t/harriet/

実際は、.provercに

-PHarriet=t/harriet/

を追加しておくと、毎回オプションをつける必要が無いんですが、これで、t/harriet/*.plをprove実行時(.tの実行前)に実行してくれるようになります。

で、何を入れておくかというと

use Test::mysqld;

$ENV{'MYSQL_DSN'} ||= do{
    $mysqld = Test::mysqld->new(
        my_cnf => {
            'skip-networking' => '',
        },
    ) or die $Test::mysqld::errstr;

    $mysqld->dsn;
};

END {
    undef $mysqld;
}

上記のmysqld.plを、t/harrietの下に入れておけば、prove実行時に、test用のmysqlが起動して、接続先が環境変数(MYSQL_DSN)に入ります。
これで、それぞれの*.tで、毎回mysqldを起動しなくても、環境変数に入ってるとこに接続すれば、1つのmysqldで全部のテストが可能になりますね!

ただ、各テストが影響しないようにする必要はありますが。
例えば、データを追加するテストをした後じゃないと、データを取得するテストがPASSしないとかとか。
これは、それぞれ必要なデータを入れてからテストをするか、初期化をするような処理を入れればいいですかね。

並列で実行した時にエラーになる場合はどうすればいいかな・・。

返信を残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください