如何手动创建TAP输出

时间:2013-06-29 18:03:43

标签: perl tap

有一个很棒的Perl模块 每个人都使用的Test::More 单元测试。这是一个非常简单的脚本t/sample_1.t

use Test::More tests => 1;

fail('This test fails');

我想编写执行相同操作的脚本,但没有 Test::More

我已经阅读了几篇关于TAP(测试任何协议)的文档,以了解如何编写脚本。我读过:

不幸的是文档还不够。我必须检查使用Test :: More的脚本输出,以找出我需要向STDERR输出诊断信息(文档中没有任何内容)。

所以,我编写了一个脚本,它与使用Test :: More脚本的脚本完全相同。以下是t/sample_2.t

的列表
$| = 1;

print "1..1\n";
print "not ok 1 - This test fails\n";
print STDERR "#   Failed test 'This test fails'\n";
print STDERR "#   at t/sample_1.t line 3.\n";
print STDERR "# Looks like you failed 1 test of 1.\n";

exit 1;

但是当使用prove这两个脚本输出不同的东西时。 prove中的“#Failed test'此测试失败'”行显示在不同的行上以进行不同的测试。这是截图:

Perl prove output for 2 sample unit tests

我编写了一个测试脚本,使用Capture::Tiny来检查两个脚本的STDERR,STDOUT和退出代码是否相同。脚本显示两个脚本都输出相同的内容。

我已将所有测试文件和测试脚本存储在GitHub repo

我的问题。如何在没有Test :: More的情况下编写Perl单元测试,以获得与Test :: More相同的输出。

PS如果您有兴趣我为什么需要这个。我需要这个来解决我的Perl模块the issueTest::Whitespaces

2 个答案:

答案 0 :(得分:2)

最后我发现了发生了什么。

hobbs让我advised使用Test :: Builder。我创建了测试脚本 使用Test :: More(Test::Builder)作为脚本工作的here it is

然后我开始检查Test::Builder的源代码,找出原因 这种行为的来源。这是lib / TB2 / Formatter / TAP / Base.pm的一部分 文件:

# Emit old style comment failure diagnostics
sub _comment_diagnostics {
    my($self, $result) = @_;

    ...

    # Start on a new line if we're being output by Test::Harness.
    # Makes it easier to read
    $self->$out_method("\n") if ($out_method eq 'err') and $ENV{HARNESS_ACTIVE};
    $self->$diag_method($msg);

    return;
}

所以,这就是答案。 prove设置特殊环境变量 HARNESS_ACTIVE和测试::更多和朋友放置额外的换行符号 在打印到STDERR的任何诊断之前“\ n”。

最后我创建了测试脚本,输出与脚本完全相同 用Test编写::更多。 Source code of the script

我真的不喜欢这个解决方案。我花了太多时间和其他人 找出发生了什么。我敢肯定,漂亮输出的任务应该是 在TAP解析器中解决,而不是在TAP生成器中解决。

=(

答案 1 :(得分:1)

虽然我完全不知道发生了什么,但我可以通过在STDERR的任何其他输出之前包含以下内容来使输出匹配(至少在视觉上):

print STDERR "\r";

这使得它们在通过prove或普通旧perl时可视化匹配。但是,这是 NOT Test :: More正在做什么。

您输出的TAP是按规格;如果prove希望以不同于TAP测试的方式对待它:更多正在输出,我认为这是prove中的一个错误(或至少是一个奇怪的错误)。就个人而言,当我编写测试模块时,我总是使用Test :: Builder或者包装Test :: More来输出TAP。每个都是核心模块。这似乎是大多数测试模块倾向于做的事情。