まいんだーのはてなブログ

はてブなのはてブロなのどっちなの

make test で Test::riak を永続化させる方法

Test::riak で割とカジュアルに Riak を試せるようになったんですがいかんせん起動に時間がかかってしまいます。
使ってるファイル数が少なければそんなに問題にならないのですが、例えばテスト実行時に自動的に初期化処理するような枠組みに入れ込んだ場合 make test が終わらなくなって捗りません。
実際テスト周りを整備しててはかどらなかったので、 さいくろん案 を採用することで捗るようにしたので、その辺をup。

※SEE ALSO -> 環境変数にいろいろ突っ込み過ぎると危険があぶない

  • Test::MyAPP::riak
package Test::MyAPP::riak;
use strict;
use warnings;

use Data::Riak::Fast;
use JSON::XS;
use Test::riak;

sub DESTROY {
    my $self = shift;
    $self->cleanup;
}

sub setup {
    my $self = shift;

    my $riak;
    if (my $json = $ENV{TEST_RIAK}) {
        warn $ENV{TEST_RIAK};
        my $obj = decode_json $json;
        $riak = bless $obj, 'Test::riak';
    }
    else {
        $riak = Test::riak->new or die $Test::riak::errstr;
    }

    return $riak;
}

sub cleanup {
    my ($self, $riak) = @_;

    my $riak_client = Data::Riak::Fast->new({
            transport => Data::Riak::Fast::HTTP->new({
                    host => '127.0.0.1',
                    port => $riak->http_port,
                })
        });

    my $buckets = $riak_client->_buckets;
    for my $bucket_name ( @{$buckets->{'buckets'}} ) {
        my $bucket = Data::Riak::Fast::Bucket->new({
                name => $bucket_name,
                riak => $riak_client,
            });
        $bucket->remove_all;
    }
}
1;
use inc::Module::Install;
use Module::Install::TestTarget;
 
name 'MyApp';
all_from 'lib/MyApp.pm';
 
requires 'HOGEHOGE';
 
test_requires 'Test::More';
test_requires 'Test::riak';
 
tests 't/*.t t/*/*.t t/*/*/*.t';
author_tests 'xt';
 
default_test_target(
    includes       => ['t/lib'],
    run_on_prepare => ['t/script/setup_riak.pl'],
);
 
auto_include();
WriteAll;
  • t/script/setup_riak.pl
use Test::MyAPP::riak;
use JSON::XS;
 
$SIG{INT} = sub { CORE::exit 1 };
$riak = Test::MyAPP::riak->setup;
$ENV{TEST_RIAK} = encode_json +{ %$riak };

こんなかんじでほとんど xaicron さんの書いたものと同じようにつかえます。
今の環境では更に utility モジュールを作って毎回の初期化時に config 書き換えたり cleanup を実行するようにして、良い感じに抽象化されて毎回クリーンな Riak を意識せずにつかえるようになって捗るようになりました。

あと kan++ hiratara++