是否有可以测试另一个程序的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中为它编写一个测试框架。所以,具体来说,我想测试一串输出的不良形式。
我已经编写了一个可以满足我想要的模块,所以请为了其他人的利益随意回答这个问题,但就我而言,任何进一步的答案都是学术性的。
答案 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章中的例子
它使用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作为一个很好的起点。它功能强大但相当容易使用,并且肯定会比一次性拼凑一些东西更好。