为什么我的 CGI 程序的 Perl 单元测试未能通过所有测试?



我想用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 输出通道。

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

但是需要很多经验才能真正不因如此多失败的测试输出而感到沮丧,才能真正阅读整个内容并在此基础上理解它可能意味着什么。对于它的价值,我也没有全部阅读。我浏览了测试输出,看看我得到了相同的结果,然后阅读了代码并发现了./cgi.pl,这让我感到疑惑。出于某种原因,我还记得我现在在Windows上。可能是因为一开始运行它很辛苦。

现在所有命令行都成功地解决了@simbabque

perl cgi.t

1..2

子测试:获取

1..5
ok 1 - GET
ok 2 - name
ok 3 - email
ok 4 - stderr is empty
ok 5 - exit code is 0

确定 1 - 获取

子测试:发布

1..5
ok 1 - POST
ok 2 - language
ok 3 - creator
ok 4 - stderr is empty
ok 5 - exit code is 0

确定 2 - 发布

并使用此命令:

prove cgi.t

cgi.t .. ok

所有测试均成功。

文件=1,测试=2,1 挂钟秒(0.11 usr 0.02 系统 + 0.64 cusr 0.08 csys = 0.85 CPU(

结果:通过

最新更新