如何测试Perl程序是否从我的测试套件编译?

时间:2009-06-23 16:49:59

标签: perl testing

我正在为一些Perl脚本构建回归系统( not 单元测试)。

系统的核心组件是

  `perl script.pl @params 1>stdoutfile 2>stderrfile`;

但是,在实际处理脚本的过程中,它们有时不会编译(Shock!)。但 perl 本身将正确执行。但是,我不知道如何在stderr上检测Perl是否无法编译(因此写入stderr),或者我的脚本在输入上被禁止(因此写入stderr)。

如何检测程序是否执行,没有详尽地查找Perl错误消息并轻击stderr文件?

5 个答案:

答案 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