我一直在尝试使用Perl实用程序/模块“证明”作为一些单元测试的测试工具.单元测试比“单元”多一点“系统”,因为我需要将一些后台进程作为测试的一部分,使用以下…
sub SpinupMonitor{ my $base_dir = shift; my $config = shift; my $pid = fork(); if($pid){ return $pid; }else{ my $cmd = "$base_dir\/..\/bin\/monitor_real.pl -config $config -test"; close STDOUT; exec ($cmd) or die "cannot exec test code [$cmd]\n"; } } sub KillMonitor{ my $pid = shift; print "Killing monitor [$pid]\n"; kill(1,$pid); }
然而,由于某些原因,当我有.t文件时,会启动一些额外的进程,它会导致测试工具在所有测试完成后挂起在第一个.t文件的末尾,而不是进入下一个文件,或退出如果只有一个.
起初我想知道是否可能是因为我是在杀死我的子进程而使它们失效.所以我补充说
$SIG{CHLD} = \&REAPER; sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; }
代码.但这没有帮助.实际上,在封闭的考试中,原来我的perl测试文件已经退出了,现在是一个不成熟的过程,它是证明包装的脚本,没有收获它的孩子.事实上,当我在测试脚本末尾添加一个die()调用时,我得到了…
# Looks like your test died just after 7.
所以我的脚本退出了,但由于某种原因,线束并没有松动.
我确实确定这是我的子进程,这是令人不安的,当我禁用他们,而测试失败的线束正确退出.
有什么我做错了我的方式启动我的过程可能会扰乱线束在某种程度上吗?
谢谢
彼得
解决方法
我假设你所有的孩子在你离开考试之前已经退出了?否则可能会挂在STDERR上,这可能会混淆证明.如果您可以关闭STDERR,或者至少重定向到父进程中的管道,这可能是您遇到的一个问题.
此外,我还指出,你不需要逃避斜线,如果你不使用shell元字符(空格不是元字符的perl – 认为“*?{}()”),你应该明确并创建一个列表:
use File::Spec; my @cmd = File::Spec->catfile($basedir,File::Spec->updir(),qw(bin monitor_real.pl) ),-config => $config,-test =>; close STDOUT; close STDERR; exec (@cmd) or die "cannot exec test code [@cmd]\n";