我正在为一些Perl脚本构建回归系统( not 单元测试)。
系统的核心组件是
`perl script.pl @params 1>stdoutfile 2>stderrfile`;
但是,在实际处理脚本的过程中,它们有时不会编译(Shock!)。但 perl 本身将正确执行。但是,我不知道如何在stderr上检测Perl是否无法编译(因此写入stderr),或者我的脚本在输入上被禁止(因此写入stderr)。
如何检测程序是否执行,没有详尽地查找Perl错误消息并轻击stderr文件?
答案 0 :(得分:6)
最简单的方法是分两步完成:
system('$^X -c script.pl');
if ($? == 0) {
# it compiled, now let's see if it runs
system('$^X script.pl', @params, '1>stdoutfile', '2>stderrfile');
# check $?
}
else {
warn "script.pl didn't compile";
}
请注意使用$^X
代替perl
。这更灵活,更强大。它确保您从相同的安装运行,而不是在路径中首先显示的任何解释器。系统调用将继承您的环境(包括PERL5LIB),因此生成不同版本的perl可能会导致难以诊断的兼容性错误。
答案 1 :(得分:3)
当我想检查程序是否编译时,我检查它是否编译:)
这是我放入 t / compile.t 以与我的测试套件的其余部分一起运行的内容。如果脚本没有编译,它会停止所有测试“纾困”:
use Test::More tests => 1; my $file = '...'; print "bail out! Script file is missing!" unless -e $file; my $output = `$^X -c $file 2>&1`; print "bail out! Script file does not compile!" unless like( $output, qr/syntax OK$/, 'script compiles' );
答案 2 :(得分:3)
众所周知,脚本难以测试。你必须运行它们然后刮掉它们的输出。你无法对他们的胆量进行单元测试......或者你可以吗?
#!/usr/bin/perl -w
# Only run if we're the file being executed by Perl
main() if $0 eq __FILE__;
sub main {
...your code here...
}
1;
现在您可以像任何其他库一样加载脚本。
#!/usr/bin/perl -w
use Test::More;
require_ok("./script.pl");
您甚至可以运行并测试main()。 Test::Output可以方便地捕获输出。您可以说local @ARGV
来控制参数,或者您可以更改main()以将@ARGV作为参数(推荐)。
然后你可以开始将main()拆分成更小的例程,你可以轻松地进行单元测试。
答案 3 :(得分:2)
查看$?
变量。
来自perldoc perlvar
:
最后一个管道返回的状态 close,backtick(“``”)命令, 成功调用wait()或 waitpid(),或从系统() 运营商。这只是16位 由...返回的状态字 传统的Unix wait()系统调用 (或者说是看起来像它)。 因此,子进程的退出值 是真的(“$?>> 8”)和“$?& 127” 给出哪个信号,如果有的话 过程死了,“$?& 128” 报告是否存在核心转储。
答案 4 :(得分:0)
听起来你需要IPC::Open3
。