make testではまった件

CPAN風にperl moduleを書いてる人はtestコードをガンガン書いてmake testしながら、日々うっとりしてると思うんですが、
今日はちょっとそこでハマったので、忘れないようにメモメモ。


testコードの中で、簡易なHTTP Serverを起動したいとします。
サーバのコードはserver.plで、POE::Component::Server::HTTPあたりでちょろっと書いたものだとしましょう。
こいつは一応デーモンなので、テストコードからは&をつけてバックグランドジョブとして起動します。
で、そのデーモンに対してHTTPリクエストをなげて結果をテストするとします。

テストコードはこんな感じ。(dummy_server.tとします)

use strict;
use LWP::Simple;
use Test::More tests=>1;

BEGIN{
  system("t/server.pl &");
  sleep(1);
}

my $data = get("http://localhost:10080/test_01");
is($data, "xxxx", "OK");

これをmake testしようとすると、いつまでたっても返ってこないんですよ。
ちなみに

perl -Mblib t/dummy_server.t

とすると、これは順調に通るんですよ。

naze?


小一時間、いや中一時間ほど悩んだんだが、これで解決した。

use strict;
use LWP::Simple;
use Test::More tests=>1;

BEGIN{
  system("t/server.pl &");
  sleep(1);
}

END{
  system("pkill -f server.pl");
}

my $data = get("http://localhost:10080/test_01");
is($data, "xxxx", "OK");

要するにENDブロックで起動したサーバを落とすようにしたんだけど。

単体でtestすれば問題ないけど、make testで一気にまとめてテストするときは、どうやらそのスクリプトから起動したプロセスはキレイに後始末しないと先に進まないみたいですね。

しらなかったよ〜。