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

我可以使用什么Perl模块来测试CGI输出的常见错误?,perl,testing,cgi,cpan,Perl,Testing,Cgi,Cpan,是否有一个Perl模块可以测试另一个程序的CGI输出?我有一个计划 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语言的“浏览器”,用于处理输出

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

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为它编写一个测试框架。因此,具体地说,我想测试一个输出字符串的格式是否不正确

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

如果您想检查x.cgi的输出是否正确格式化为HTML/XHTML/XML/等,为什么不通过W3验证程序运行它呢


您可以从Perl测试脚本中调用它,并找到一些方法。或者,您可以利用。

如果您想编写一个测试框架,我建议您从CPAN的Test::More作为一个良好的起点。它功能强大,但使用起来相当简单,肯定比一次性拼凑起来要好。

有一个,看起来就像你要找的。它特别提到了测试非Perl CGI程序的能力。它已经有一段时间没有更新了,但是CGI规范也没有更新。我没有使用它,但似乎有一个界面,适合您的要求

比较响应标头 $header\u名称的值为$value 使用Test::Builder是>

$test->header_like($header_name, $regex, [, $description]);
比较响应标头 $header\u带有正则表达式$regex的名称 使用Test::Builder like>


请看perl手册第16章中的示例

16.9. 控制另一程序的输入、输出和错误 它使用IPC::Open3。 Fom perl cookbook,可能由我修改,请参见下文

例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);
使用IPC::Open3;
使用IO::Select;
$cmd=“grep vt33/none/such-/etc/termcap”;
my$pid=open3(*CMD\u IN,*CMD\u OUT,*CMD\u ERR,$CMD);
$SIG{CHLD}=sub{
如果waitpid($pid,0)>0,则在$pid上打印“收割者:状态$?\n”
};
#在“测试1 2 3\n”中打印CMD_;
关闭(CMD_IN);
my$selector=IO::Select->new();
$selector->add(*CMD\u ERR,*CMD\u OUT);
while(my@ready=$selector->can_read){
foreach my$fh(@ready){
如果(fileno($fh)==fileno(CMD_ERR)){print“STDERR:”,scalar}
else{print“STDOUT:,scalar}
$selector->remove($fh)(如果eof($fh));
}
}
关闭(CMD_OUT);
关闭(命令错误);

这是一个很好的建议,但我对HTTP头很感兴趣,这对我来说是行不通的。谢谢这是一个很好的建议,我已经使用了Test::More,但我正在寻找一些专门针对HTTP头的建议。谢谢cjm,你总是这么有帮助。我会看一看,如果它符合我的要求,我会把它标记为被接受的答案。这一个似乎没有通过自己的测试,所以我不抱希望。CPAN测试人员说:
PASS(2)FAIL(238)NA(1)UNKNOWN(41)
。我想也许我可以从中挽救一些东西,但不幸的是,看起来这从来都不是一个真正的模块,只是一堆文档和存根函数,它们实际上做不了什么,八年前,两位作者都放弃了它,但都没有完成。不过还是要谢谢你的建议。我现在要做的是编写我自己的模块。无论是谁(除了我之外)投票支持这个模块,都应该解释自己,这个模块是一只狗。谢谢,但不幸的是,这不是我想要的,因为它通过向服务器发送HTTP请求来工作。我的问题是我想检查
x.cgi
是否做了一些糟糕的事情,比如在发送头之前打印出一些东西等等。如果
x.cgi
有这些问题,那么它在服务器环境下无法工作,服务器只会将状态500发送回测试框架,这是没有用的,因为我不知道是哪一部分的
x.cgi
造成了这种不良行为;它有一种方法来创建一个伪用户代理,这看起来很有希望。好的,我会进一步调查的-我投反对票。我猜您没有阅读问题或已经给出的答案。您写道:“我希望有一种Perl“浏览器”来处理输出。CGI脚本通过在标准输出上打印HTTP消息来生成输出。我很抱歉您这样认为,但是我已经做了很大的努力来解释我在其他答案的评论中寻找的东西。
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);