我可以使用什么Perl模块来测试常见错误的CGI输出?

时间:2011-03-01 01:48:42

标签: perl testing cgi cpan

是否有可以测试另一个程序的CGI输出的Perl模块?例如。我有一个程序

x.cgi

(这个程序不在Perl中),我想从程序

运行它
test_x_cgi.pl

所以,例如test_x_cgi.pl就像

#!perl
use IPC::Run3
run3 (("x.cgi"), ...)

所以在test_x_cgi.pl我希望自动检查x.cgi的输出是不是会做愚蠢的事情,例如在HTTP标头完全输出之前打印消息。换句话说,我想在Perl中使用一种处理输出的“浏览器”。在我尝试自己创建这样的东西之前,CPAN上是否有任何模块可以做到这一点?

请注意x.cgi这里不是Perl脚本;我试图在Perl中为它编写一个测试框架。所以,具体来说,我想测试一串输出的不良形式。

编辑:谢谢

我已经编写了一个可以满足我想要的模块,所以请为了其他人的利益随意回答这个问题,但就我而言,任何进一步的答案都是学术性的。

5 个答案:

答案 0 :(得分:2)

CGI::Test,看起来就像你在找什么。它特别提到了测试非Perl CGI程序的能力。它暂时没有更新,但CGI规范都没有。

答案 1 :(得分:1)

Test::HTTP。我没有使用它,但似乎有一个符合您要求的界面。

$test->header_is($header_name, $value [, $description]);
     

比较响应标头   $ header_name,值为$ value   使用Test :: Builder-is>。

$test->header_like($header_name, $regex, [, $description]);
     

比较响应标头   带有正则表达式$ regex的$ header_name   使用Test :: Builder-like>。

答案 2 :(得分:0)

查看perl cookbook第16章中的例子

16.9。控制另一个程序的输入,输出和错误

它使用IPC :: Open3。 Fom perl食谱,可能会被我修改,见下文。

例16.2

cmd3sel - 控制所有三个孩子进出,出错和错误。

use IPC::Open3;
use IO::Select;


$cmd = "grep vt33 /none/such - /etc/termcap";
 my $pid = open3(*CMD_IN, *CMD_OUT, *CMD_ERR, $cmd);

$SIG{CHLD} = sub {
    print "REAPER: status $? on $pid\n" if waitpid($pid, 0) > 0
};

#print CMD_IN "test test 1 2 3 \n";
close(CMD_IN);

my $selector = IO::Select->new();
$selector->add(*CMD_ERR, *CMD_OUT);

while (my @ready = $selector->can_read) {
    foreach my $fh (@ready) {
        if (fileno($fh) == fileno(CMD_ERR)) {print "STDERR: ", scalar <CMD_ERR>}
        else                                {print "STDOUT: ", scalar <CMD_OUT>}
        $selector->remove($fh) if eof($fh);
    }
}
close(CMD_OUT);
close(CMD_ERR);

答案 3 :(得分:-1)

如果要检查x.cgi的输出是否格式正确HTML / XHTML / XML / etc,为什么不通过W3 Validator运行它?

您可以download the source找到一些方法从Perl测试脚本中调用它。或者,您可以利用this Perl interface to calling the W3 Validator on the web

答案 4 :(得分:-1)

如果你想编写一个测试框架,我建议你从CPAN看一下Test :: More作为一个很好的起点。它功能强大但相当容易使用,并且肯定会比一次性拼凑一些东西更好。