Perl5 Advent Calendar 2015 4日目の記事です。
Test::TCP というテストモジュールはご存じですよね? TCP サーバを実際に (空いているポートを自動で見つけて) 起動して、それに対するテストを簡単に書ける素晴らしいものです。
諸般の事情により、TCP ではなく UNIX domain socket を使用するサーバについても同じことをしたかったため、Test::UNIXSock を作りました。
使い方はほぼ同じです。Test::TCP では port が渡ってくるところが一時的に生成された UNIX domain socket の path になっているので、それを使って server, client のコードを書いて普通にテストするだけです。
以下は memcached への接続をテストする例です。
use 5.12.0;
use Test::UNIXSock;
use Test::More;
use Cache::Memcached;
test_unix_sock(
server => sub {
my $path = shift;
exec "memcached", '-s' => $path;
die "cannot execute memcached: $!";
},
client => sub {
my $path = shift;
my $memd = Cache::Memcached->new({ servers => [ $path ] });
ok $memd->set( foo => "FOO" );
is $memd->get("foo"), "FOO";
},
);
done_testing;
ちなみに UNIX domain socket を使いたかった理由ですが、テストの並列数を多くしていくと Test::TCP が返す port が競合して fail することがあったためです。
誰も使っていないことを Test::TCP が確認して port 番号をテストコードに渡してから、実際に利用するまでの間に時間差があるので、致し方ないですね。
Test::TCP ほど使う場面はないかもしれませんが、機会があればぜひご利用ください。