有一个很棒的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'此测试失败'”行显示在不同的行上以进行不同的测试。这是截图:
我编写了一个测试脚本,使用Capture::Tiny来检查两个脚本的STDERR,STDOUT和退出代码是否相同。脚本显示两个脚本都输出相同的内容。
我已将所有测试文件和测试脚本存储在GitHub repo。
我的问题。如何在没有Test :: More的情况下编写Perl单元测试,以获得与Test :: More相同的输出。
PS如果您有兴趣我为什么需要这个。我需要这个来解决我的Perl模块the issue的Test::Whitespaces。
答案 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。每个都是核心模块。这似乎是大多数测试模块倾向于做的事情。