gpt4 book ai didi

perl - 为什么我对 CGI 程序的 Perl 单元测试所有测试都失败了?

转载 作者:行者123 更新时间:2023-11-28 20:04:29 25 4
gpt4 key购买 nike

我想用 perl .cgi 测试一个小程序

该程序位于以下网址:

https://perlmaven.com/testing-perl-cgi

这个程序是一个一般测试,他说:

“这足以展示如何测试任何 CGI 脚本”

然后我将 2 个 cgi 复制/粘贴到同一目录中并尝试命令行:

prove cgi.t

通常都成功

错误是:

     Failed test 'GET'
# at cgi.t line 20.
# ''
# doesn't match '(?^:<tr><td>request_method</td><td>GET</td></tr>)'

# Failed test 'name'
# at cgi.t line 21.
# ''
# doesn't match '(?^:<tr><td>name</td><td>foo</td></tr>)'

# Failed test 'email'
# at cgi.t line 22.
# ''
# doesn't match '(?^:<tr><td>email</td><td>bar\@corp.com</td></tr>)'

# Failed test 'stderr is empty'
# at cgi.t line 23.
# got: 'Can't exec "./cgi.pl": Permission denied at cgi.t line 17.
# '
# expected: ''

# Failed test 'exit code is 0'
# at cgi.t line 24.
# got: '-1'
# expected: '0'
# Looks like you failed 5 tests of 5.
cgi.t .. 1/2
# Failed test 'get'
# at cgi.t line 25.

# Failed test 'POST'
# at cgi.t line 43.
# ''
# doesn't match '(?^:<tr><td>request_method</td><td>POST</td></tr>)'

# Failed test 'language'
# at cgi.t line 44.
# ''
# doesn't match '(?^:<tr><td>language</td><td>Perl</td></tr>)'

# Failed test 'creator'
# at cgi.t line 45.
# ''
# doesn't match '(?^:<tr><td>creator</td><td>TimToady</td></tr>)'

# Failed test 'stderr is empty'
# at cgi.t line 46.
# got: 'sh: ./cgi.pl: Permission denied
# '
# expected: ''

# Failed test 'exit code is 0'
# at cgi.t line 47.
# got: '32256'
# expected: '0'
# Looks like you failed 5 tests of 5.

# Failed test 'post'
# at cgi.t line 48.
# Looks like you failed 2 tests of 2.
cgi.t .. Dubious, test returned 2 (wstat 512, 0x200)
Failed 2/2 subtests

Test Summary Report
-------------------
cgi.t (Wstat: 512 Tests: 2 Failed: 2)
Failed tests: 1-2
Non-zero exit status: 2
Files=1, Tests=2, 1 wallclock secs ( 0.12 usr 0.01 sys + 0.44 cusr 0.06 csys = 0.63 CPU)
Result: FAIL

提前致谢,

奥诺特

最佳答案

我现在恰好启动到 Windows,并且看到了类似的故障。

这个问题对于初学者来说很难发现,但实际上非常简单。

my ($out, $err, $exit) = capture { system "./cgi.pl" };

该程序的调用方式显然非常Linux-y。如果你将其更改为 perl cgi.pl 它将起作用。这是因为命令的 ./ 部分告诉 Linux shell 运行当前目录中的程序 cgi.pl。它通过查找文件,查看它是否具有可执行标志,然后查找文件的第一行来实现这一点。在那里,它找到 shebang (#!/usr/bin/perl),它告诉它用什么程序运行该文件。

在 Windows 上,它不会那样工作,因此您需要直接调用 perl 可执行文件。然而,就您而言,这是因为该文件不可执行

你可以像我上面说的那样改变它,或者你可以在你的程序上设置可执行标志。在命令行中运行它。它将把你的程序标记为可执行文件,操作系统就会知道要做什么。

$ chmod u+x cgi.pl

如果您要更改代码,请记住您需要在两个地方进行更改。


可以从测试输出中推断出这一点。其中一项失败的测试向我们展示了 $err 的返回值,它是命令的 STDERR 输出 channel 。

#   Failed test 'stderr is empty'
# at cgi.t line 23.
# got: 'Can't exec "./cgi.pl": Permission denied at cgi.t line 17.
# '
# expected: ''

但是需要大量的经验才能真正不因如此多的失败测试输出而感到沮丧,从而真正阅读整个内容并理解其含义。就其值(value)而言,我也没有全部读完。我浏览了测试输出,发现得到了相同的结果,然后阅读代码并发现了 ./cgi.pl,这让我感到好奇。出于某种原因,我还记得我现在使用的是 Windows。可能是因为一开始运行它很辛苦。

关于perl - 为什么我对 CGI 程序的 Perl 单元测试所有测试都失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51956908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com