Perl 단위 테스트에서 포킹 하위 프로세스가 입증됩니다. 시험 :: 하네스 종료
-
06-07-2019 - |
문제
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 테스트 파일이 종료되었으며 이제는 소멸 된 과정이며 자식을 거두지 못한 래퍼 스크립트입니다. 사실 테스트 스크립트의 끝에서 다이 () 호출을 추가했을 때 나는 ...
# Looks like your test died just after 7.
그래서 내 스크립트는 종료되었지만 어떤 이유로 든 하네스가 풀리지 않습니다.
테스트가 실패한 동안 하네스가 제대로 빠져 나간 동안 비활성화했을 때와 같이 화를내는 것이 내 하위 프로세스임을 확인했습니다.
어떤 식 으로든 하네스를 화나게 할 수있는 프로세스를 시작하는 방식으로 내가 잘못하고있는 일이 있습니까?
감사
베드로
해결책
시험을 떠나기 전에 모든 아이들이 종료했다고 가정하고 있습니까? 그렇지 않으면 Stderr에 매달려있을 수 있습니다. STDERR을 닫거나 부모 프로세스의 파이프로 리디렉션 할 수 있다면, 이는 하나의 문제 일 수 있습니다.
그 외에도 앞으로 슬래시를 피할 필요가 없으며 쉘 메타 카라 터를 사용하지 않는 경우 (공간은 Metacharacters가 Perl -Think”라고 지적합니다.*?{}()
"), 당신은 명시적이고 목록을 만들어야합니다.
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";
다른 팁
여부를 테스트하지 않습니다 fork()
실패한. 당신은 확인해야합니다 $pid
~이다 한정된 "거짓"을 가정하기 전에 "자식"을 의미합니다.
당신의 $cmd
쉘 metacharacters (공간)가 포함되어 있고, Perl은 실제로 전화 할 때 쉘을 사용하고 있습니다. exec()
. 모니터가 실행되는 동안 (1) Perl, (2) 어린이가 있습니다. sh -c
, 및 (3) 손자 Perl 달리기 monitor_real.pl
. 특히 의미하는 바는 당신이 전화 할 때입니다 KillMonitor
, 당신은 모니터가 아니라 껍질을 죽이고 있습니다 (당신이 가지고있는 PID이기 때문에).
당신은 또한 관심이있을 수 있습니다 데몬 프로세스를 어떻게 포크합니까? Perl FAQ에서.