5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Test::UNIXSock で UNIX domain socket のサーバもテストする

Posted at

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 ほど使う場面はないかもしれませんが、機会があればぜひご利用ください。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?