Prove使用Test :: More和.tap扩展名

时间:2017-05-21 21:25:11

标签: perl tap

尝试使用Test::More对名为test.tap的文件进行基本测试:

use Test::More tests => 2;

is( 1, 1 );
is( 2, 2 );

针对此测试运行prove会导致失败:

$ prove test.tap
test.tap .. No subtests run

Test Summary Report
-------------------
test.tap (Wstat: 0 Tests: 0 Failed: 0)
  Parse errors: No plan found in TAP output
Files=1, Tests=0,  0 wallclock secs ( 0.02 usr +  0.00 sys =  0.02 CPU)

但是Perl提供了看似有效的TAP输出:

$ perl test.tap
1..2
ok 1
ok 2

prove版本是:

$ prove --version
TAP::Harness v3.35 and Perl v5.22.1

此外,我发现在测试文件中添加shebang #!会导致测试结果间歇性传递

#!/usr/bin/perl

use Test::More tests => 2;

is( 1, 1 );
is( 2, 2 );

成功(4次传递〜1次):

t/test.tap .. ok
All tests successful.
Files=1, Tests=2,  0 wallclock secs ( 0.03 usr  0.00 sys +  0.01 cusr  0.00 csys =  0.04 CPU)
Result: PASS

我还发现将文件重命名为test.t会导致测试每次都通过。

在尝试查找旧版本中的错误时,我已经在运行Ubuntu 16.04.2的新鲜DigitalOcean Droplet以及带有TAP::Harness v3.36_01和Perl v5.24.1的Debian 8主机上复制了此问题。

我希望避免“将所有文件重命名为.t扩展名”作为答案。我不确定TAP::Harness认为这两个扩展之间的区别是什么,并且找不到任何文档或源代码中的区别在哪里。

非常感谢任何有关正在发生的事情的澄清。

1 个答案:

答案 0 :(得分:4)

.tap扩展名告诉您test.tap是包含TAP的文本文件。它不会将它作为Perl程序执行,它只是读取文件并尝试将其解析为TAP。您可以使用prove -v来查看此内容。

$ prove -v test.tap
test.tap .. 
use Test::More tests => 2;
is(1,1);
is(2,2);

No subtests run 

Test Summary Report
-------------------
test.tap (Wstat: 0 Tests: 0 Failed: 0)
  Parse errors: No plan found in TAP output
Files=1, Tests=0,  0 wallclock secs ( 0.02 usr +  0.00 sys =  0.02 CPU)
Result: FAIL

相反,要执行的测试程序的约定是test.t

$ mv test.tap test.t
$ prove -v test.t
test.t .. 
1..2
ok 1
ok 2
ok
All tests successful.
Files=1, Tests=2,  0 wallclock secs ( 0.03 usr  0.00 sys +  0.04 cusr  0.00 csys =  0.07 CPU)
Result: PASS

有关详情,请参阅TAP::Parser::SourceHandler::File

  

此外,我发现在测试文件中添加一个shebang会导致测试结果间歇性地传递:

正在发生的事情是各种TAP :: Parser :: SourceHandler插件都在投票,它是一个平局。 TAP::Parser::SourceHandler::Perl看到“ a shebang ala”#!... perl “并投票0.9。TAP::Parser::SourceHandler::File看到.tap扩展名并投票0.9。你可以通过设置TAP_HARNESS_SOURCE_FACTORY_VOTES环境变量。

$ TAP_HARNESS_SOURCE_FACTORY_VOTES=1  prove test.tap
votes: TAP::Parser::SourceHandler::File: 0.9, TAP::Parser::SourceHandler::Perl: 0.9
test.tap .. ok   
All tests successful.
Files=1, Tests=2,  0 wallclock secs ( 0.03 usr  0.00 sys +  0.05 cusr  0.00 csys =  0.08 CPU)
Result: PASS

$ TAP_HARNESS_SOURCE_FACTORY_VOTES=1  prove test.tap
votes: TAP::Parser::SourceHandler::Perl: 0.9, TAP::Parser::SourceHandler::File: 0.9
test.tap .. No subtests run 

Test Summary Report
-------------------
test.tap (Wstat: 0 Tests: 0 Failed: 0)
  Parse errors: No plan found in TAP output
Files=1, Tests=0,  0 wallclock secs ( 0.02 usr +  0.01 sys =  0.03 CPU)
Result: FAIL

然后通过投票对处理程序进行排序。由于Perl的排序不稳定,即如果两个条目相等而不保留它们的顺序,则处理程序可以排在最前面。即使使用稳定排序,它也会从keys %handlers进行排序,每个过程都会以不同的顺序排序。 Here's the code for that

对于测试工具来说,决策不确定是不好的。它可能应该抛出错误。我还注意到它正在使用字符串比较,这可能是错误的。

I've submitted a patch to make ties an error