为什么我的 CGI 程序的 Perl 单元测试无法通过所有测试?
Why does my Perl unit test for a CGI program fail all its tests?
我想用 perl .cgi 测试一个小程序
这个节目在这个url:
https://perlmaven.com/testing-perl-cgi
这个程序是一般测试,他说:
"it is enough to show how to test any CGI-script"
然后我copy/paste同一目录下的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
可执行文件。但是,在您的情况下,这是因为 文件不可执行 .
你可以像我上面说的那样改变它,或者你可以在你的程序上设置可执行标志。 运行 这在命令行中。它会将您的程序标记为可执行程序,OS 将知道该怎么做。
$ chmod u+x cgi.pl
如果您进行代码更改,请记住您需要在两个地方进行更改。
您可以从测试输出中推断出这一点。其中一项失败的测试向我们显示了 $err
的 return 值,这是命令的 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
子测试:get
1..5
ok 1 - GET
ok 2 - name
ok 3 - email
ok 4 - stderr is empty
ok 5 - exit code is 0
确定 1 - 得到
子测试:post
1..5
ok 1 - POST
ok 2 - language
ok 3 - creator
ok 4 - stderr is empty
ok 5 - exit code is 0
还行 2 - post
并使用此命令:
prove cgi.t
cgi.t .. 好的
所有测试成功。
文件=1,测试=2,1 挂钟秒 ( 0.11 usr 0.02 sys + 0.64 cusr 0.08 csys = 0.85 CPU)
结果:通过
我想用 perl .cgi 测试一个小程序
这个节目在这个url:
https://perlmaven.com/testing-perl-cgi
这个程序是一般测试,他说:
"it is enough to show how to test any CGI-script"
然后我copy/paste同一目录下的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
可执行文件。但是,在您的情况下,这是因为 文件不可执行 .
你可以像我上面说的那样改变它,或者你可以在你的程序上设置可执行标志。 运行 这在命令行中。它会将您的程序标记为可执行程序,OS 将知道该怎么做。
$ chmod u+x cgi.pl
如果您进行代码更改,请记住您需要在两个地方进行更改。
您可以从测试输出中推断出这一点。其中一项失败的测试向我们显示了 $err
的 return 值,这是命令的 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
子测试:get
1..5
ok 1 - GET
ok 2 - name
ok 3 - email
ok 4 - stderr is empty
ok 5 - exit code is 0
确定 1 - 得到
子测试:post
1..5
ok 1 - POST
ok 2 - language
ok 3 - creator
ok 4 - stderr is empty
ok 5 - exit code is 0
还行 2 - post
并使用此命令:
prove cgi.t
cgi.t .. 好的
所有测试成功。
文件=1,测试=2,1 挂钟秒 ( 0.11 usr 0.02 sys + 0.64 cusr 0.08 csys = 0.85 CPU)
结果:通过