使用 Test::More 和 .tap 扩展名证明 returns 不一致的测试结果
Prove returns inconsistent test results with Test::More and .tap extension
正在尝试使用 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
会导致测试每次都通过。
为了寻找旧版本中的错误,我在新的 DigitalOcean Droplet 运行 Ubuntu 16.04.2 和 [=24= 的 Debian 8 主机上复制了这个问题] v3.36_01 和 Perl v5.24.1.
我希望避免 "Rename all files to .t extension" 成为答案。我不确定 TAP::Harness
认为这两个扩展之间的区别是什么,并且找不到任何文档或在源代码中的什么地方进行了区分。
非常感谢任何关于正在发生的事情的澄清。
.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。
Additionally, I found that adding a shebang to the test file causes test results intermittently pass:
发生的事情是各种 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.
测试工具在其决策中不具有确定性是不好的。它可能应该抛出一个错误。我还注意到它使用的是字符串比较,这可能是错误的。
正在尝试使用 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
会导致测试每次都通过。
为了寻找旧版本中的错误,我在新的 DigitalOcean Droplet 运行 Ubuntu 16.04.2 和 [=24= 的 Debian 8 主机上复制了这个问题] v3.36_01 和 Perl v5.24.1.
我希望避免 "Rename all files to .t extension" 成为答案。我不确定 TAP::Harness
认为这两个扩展之间的区别是什么,并且找不到任何文档或在源代码中的什么地方进行了区分。
非常感谢任何关于正在发生的事情的澄清。
.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。
Additionally, I found that adding a shebang to the test file causes test results intermittently pass:
发生的事情是各种 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.
测试工具在其决策中不具有确定性是不好的。它可能应该抛出一个错误。我还注意到它使用的是字符串比较,这可能是错误的。