2013-05-21
テストコード内でタイムアウトさせる
ちょっと前にニート生活してた頃、JUnit 実践入門という本を読みました。
で、ルールというアノテーションを使った機能があって、その中で、「Timeout」というルールがあることを知りました。テストに時間がかかりすぎたり、無限ループした場合にタイムアウトして落とす、という機能だそうで。めっちゃ便利そうやん。
「Perl でできるかなー?」と思って調べたけど、軽くぐぐった感じではそういうモジュールは無いらしい。(RFE は上がっていたが)。移植性とか考えなくていいなら、下記でいけるっぽい。
subtest '長い時間かかったり、無限ループしたり、ハングったりするかもしれないテスト', sub {
local $SIG{ALRM} = sub { die "timeout" };
alarm 3; # 3秒でタイムアウト
... # テスト本処理
};
本当は Test::More がプラガブル(2.0からそうなるんだっけ?)になって、プラグインでこういうの出来るとかっちょいいと思うんですけどね。