Harriet ー テストのときつかうにデーモンの取扱を簡単にするためのフレームワーク
- https://github.com/tokuhirom/Harriet/
- https://metacpan.org/module/TOKUHIROM/Harriet-0.01/lib/Harriet.pm
テストのときにつかう mysqld, memcached, stf, groonga あたりのデーモンを、.t 単位で起動していては遅くてかなわない。かといって、あらかじめ起動させておくというのも。。 というわけで prove のプラグインとしてよしなにする、みたいなのをがんばってかく、というような試みがおこなわれてきたわけですが、どうもめんどくさい。 なんか適当にやったらうまくうごく、っていうかんじのカジュアルなツールがほしいな、なんておもったりするわけですよ
そこで、Harriet ってのをつくってみました。
なんかこう、t/harriet/mysqld.pl っていうファイル名でこんなファイルをおきましょう、と。
$ENV{TEST_MYSQL} ||= do { require Test::mysqld; my $mysqld = Test::mysqld->new( my_cnf => { 'skip-networking' => '', # no TCP socket } ) or die $Test::mysqld::errstr; $HARRIET_GUARDS::MYSQLD = $mysqld; $mysqld->dsn; };
で、t/harriet/memcached.pl っていうファイルもおきます、と。
$ENV{TEST_MEMCACHED} ||= do { require Test::TCP; my $server = Test::TCP->new( code => sub { my $port = shift; exec '/usr/bin/memcached', '-p', $port; die $!; } ); $HARRIET_GUARDS::MEMCACHED = $server; '127.0.0.1:' . $server->port; };
環境変数に、デーモンの情報をつめこみますよ、と。環境変数がすでにあったらなにもしませんよ、と。そういうことです。
この .pl ファイル自体は、ほんとうにたんなる .pl ファイルです。簡単ですね。
で、テストスクリプトの中では以下のようにやれば、スクリプトが自動的に実行され、デーモンがあれば、そのままだし、なければよしなに起動してくれ、おわったら自動的にデーモンは死亡します。
use Harriet; Harriet->new('t/harriet')->load_all();
さて、このままだととくにどうということもないのですが、ここにさらに App::Prove::Plugin::Harriet がからんできます。.proverc に -PHarriet=t/harriet/
とかいておくと、自動的に prove がテストを実行する前に t/harriet/ においてあるスクリプトをよみこんでくれます。テストスイート全体を実行する前に一回うごかしてくれるんで、らくちんであるといえましょう。
さらに、harriet コマンドというものも付属していて、マジでハードにテストしてるときは、このコマンドをつかうと、デーモンを子プロセスとして起動した上で、必要な環境変数を表示し、sleep してくれます。
% harriet t/harriet HTTP::Server::PSGI: Accepting connections at http://0:50921/ export TEST_MEMCACHED=127.0.0.1:50797 export TEST_MYSQL=DBI:mysql:dbname=test;mysql_socket=/tmp/TC_XzkXwke/tmp/mysql.sock;user=root export TEST_STF=http://127.0.0.1:50921
あとは、test を実行する terminal にコピペしておけば、なんとなくいいかんじになります。
というわけで、そんなにコード量はおおくないのですが、フレームワークとして定義することにより、お気楽にかけるようになってる雰囲気になっているので、おためしください。
なお、Harriet という名前は、プロセスを長生きをさせるという意味で、長生きした亀から名前をとっています。