それ Proc::Guard 0.04 でできるよっていう話
http://d.hatena.ne.jp/antipop/20101130/1291112500
Proc::Guard をつかってこういう風にするのはどうか。$worker_guard ってのが Scope::Guard あるいは AnyEvent の guard みたいなかんじになってます。スコープをぬけるときに、自動的にプロセスを kill した上で wait して、ゾンビプロセスをのこさない設計になっています。
proc_guard(sub { }) の中は、子プロセスの中でうごくっていうのがキモですね。
use strict; use warnings; use Test::TCP; use Test::More; use Proc::Guard 0.04 qw/proc_guard/; use Gearman::Worker; use Gearman::Client; test_tcp( client => sub { my $port = shift; my $worker_guard = proc_guard(sub { my $worker = Gearman::Worker->new; $worker->job_servers("127.0.0.1:$port"); # 例のため適当なsubrefを登録しているが、実際には、 # テストを行うfunctionをregisterする $worker->register_function(test => sub { 1 }); $worker->work while 1; }); my $client = Gearman::Client->new; $client->job_servers("127.0.0.1:$port"); my $result = $client->do_task('test'); is $$result, 1; }, server => sub { my $port = shift; exec 'gearmand', '-p', $port; } ); done_testing;