【问题标题】:Why does my Perl unit test for a CGI program fail all its tests?为什么我的 CGI 程序的 Perl 单元测试未通过所有测试?
【发布时间】:2018-08-22 19:22:23
【问题描述】:

我想在 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

提前致谢,

奥诺特

【问题讨论】:

  • 欢迎来到 Stack Overflow。正如詹姆斯所说,如果您直接联系 Gabor,他可能会向您解释。但是,让我们看看我们还能为您做些什么。
  • 其中一个失败是因为您的 cgi.pl 文件未标记为可执行文件。 chmod +x cgi.pl 应该修复那个。
  • @Shawn 好电话。它不像我想象的那样是Windows。我的错误是不同的。嗯。

标签: perl testing command cgi


【解决方案1】:

我现在恰好被引导到我的 Windows 中,我看到了类似的故障。

这个问题对于初学者来说很难发现,但真的很简单。

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

程序的调用方式显然是非常 Linux 的。如果您将其更改为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 上。可能是因为一开始运行它很辛苦。

【讨论】:

  • 附带说明一下,您可能想利用这个机会安装虚拟机,可能是 Virtual Box,并尝试使用 Linux。安装一个全新的 Ubuntu 非常简单,它也会给你一些练习。您也可能不想为新项目做 CGI。我推荐this talk by Sawyer X,这是对一个非常严肃的问题的幽默看法。这东西很旧,用起来真的不是很有趣。做一些更现代的事情,享受使用 Perl 的乐趣。这很棒。 :)
  • Re "在windows上不行,所以需要直接调用perl可执行文件",或者创建文件关联
【解决方案2】:

现在所有命令行都成功了@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 .. 好的

所有测试成功。

Files=1, Tests=2, 1 wallclock secs (0.11 usr 0.02 sys + 0.64 cusr 0.08 csys = 0.85 CPU)

结果:通过

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多