Perl 为什么我需要知道我将使用Test::More运行多少个测试?
如果我使用Perl 为什么我需要知道我将使用Test::More运行多少个测试?,perl,unit-testing,testing,Perl,Unit Testing,Testing,如果我使用使用测试::更多qw(无计划),我是坏人吗 测试::莫尔说 在做其他事情之前,你需要一个测试计划。这基本上说明了脚本将运行多少测试以防止过早失败 use Test::More tests=>23 很少有情况下,您事先不知道脚本将要运行多少测试。在这种情况下,您可以声明您没有计划。(尽量避免使用此选项,因为它会削弱您的测试。) 使用测试::更多qw(无计划) 但是,当测试运行结束时没有打印结果时,很容易看到过早失败。这似乎没什么帮助 所以我有3个问题: 默认情况下需要测试计划的原因是什么
使用测试::更多qw(无计划)
,我是坏人吗
测试::莫尔说
在做其他事情之前,你需要一个测试计划。这基本上说明了脚本将运行多少测试以防止过早失败
use Test::More tests=>23代码>
很少有情况下,您事先不知道脚本将要运行多少测试。在这种情况下,您可以声明您没有计划。(尽量避免使用此选项,因为它会削弱您的测试。)
使用测试::更多qw(无计划)代码>
但是,当测试运行结束时没有打印结果时,很容易看到过早失败。这似乎没什么帮助
所以我有3个问题:
默认情况下需要测试计划的原因是什么
从长远来看,有人发现这是一个有用且节省时间的功能吗
其他语言的其他测试套件是否支持这种情况李>
我认为,当制定计划的人力成本太高时,可以改变规则,使用no_计划,但这一成本很好地表明测试套件没有得到很好的设计
明确定义测试计划很有用的另一种情况是,当您进行此类测试时:
$coderef = sub { my $arg = shift; isa_ok $arg, 'MyClass' };
do(@args, $coderef);
及
如果不指定计划,很容易忽略测试失败以及某些断言没有按预期运行。在执行TDD时很痛苦,因为您是在机会主义地编写新测试。当我教TDD时,商店使用Perl,我们决定以无计划的方式使用我们的测试套件。我想我们可以从没有计划改为限制考试数量。当时我认为这是阻碍而不是帮助。做任何测试都比不做测试好,但测试是有意的。说明预期的测试数量可以让您查看测试脚本中是否存在阻止测试执行(或执行次数过多)的错误。如果未在特定条件下运行测试,可以使用skip函数声明:
SKIP: {
skip $why, $how_many if $condition;
...normal testing code goes here...
}
在一条评论中,您似乎认为过早退出将被视为失败,因为计划最终不会输出,但事实并非如此——除非
您使用POSIX::_退出或致命信号等终止。特别是,将产生die()和exit()
在输出的计划中(尽管测试线束应检测出除出口(0)以外的任何东西,作为提前终止的测试)
您可能希望查看Test::Most的延迟计划选项,该选项很快就会出现在Test::More中(如果还没有的话)
最近在PerlQA列表中也讨论了这一点。一个线程:我不确定您真正想问什么,因为文档摘录似乎回答了这个问题。我想知道是否所有的测试都运行了。然而,在测试套件稳定下来之前,我认为这是没有用的
在开发过程中,我使用no_计划,因为我不断地向测试套件添加内容。随着情况的稳定,我会验证应该运行和更新计划的测试数量。有些人已经提到了“测试线束”,但是没有“测试线束”这样的东西。这是大多数模块默认使用的一个,因为这是MakeMaker或Module::Build指定的,但是TAP输出独立于任何特定的TAP使用者
一些人提到了测试数量可能不同的情况。我计算出了测试,但是我需要计算数字,然后在计划中使用它。它还有助于拥有针对特定功能的小测试文件,从而减少测试数量
use vars qw( $tests );
BEGIN {
$tests = ...; # figure it out
use Test::More tests => $tests;
}
使用变量qw($测试);
开始{
$tests=…#找出答案
使用测试::更多测试=>$tests;
}
您还可以将计数与加载分开:
use Test::More;
plan tests => $tests;
使用测试::更多;
计划测试=>$tests;
最新点击也可以将计划放在末尾。默认情况下需要测试计划的原因是什么?
ysth链接到本期的大部分内容,其中包括Michael Schwern和Ovid的评论,他们分别是Test::More
和Test::Most
维护者。显然,这个问题偶尔会出现在名单上,这是一个有争议的问题。以下是要点:
不使用测试计划的原因
这很烦人而且需要时间
这不值得花时间,因为除非在某些罕见的情况下,测试脚本不会在测试工具没有注意到的情况下消亡
Test::More
可以在测试发生时对测试进行计数
如果您使用一个测试计划并且需要跳过测试,那么您需要一个skip{}
块
使用测试计划的原因
只需几秒钟即可完成。如果需要更长时间,则测试逻辑太复杂
如果代码中某处存在出口(0),则测试将成功完成,而不运行其余的测试用例。有观察力的人可能会注意到屏幕输出看起来不正确,但在自动化测试套件中,它可能会被忽略李>
开发人员可能会意外地编写测试逻辑,使某些测试无法运行
如果不提前知道要运行多少测试,就不能真正拥有进度条。这仅仅是通过内省来实现的
替代方案
Test::Simple
和Test::Most
都有一个应该在测试脚本末尾调用的方法。这是我目前采取的方法
这修复了代码中有出口(0)
的问题。但它并没有解决逻辑问题,因为逻辑会无意中跳过测试
简言之,使用计划更安全,但除非您的测试套件很复杂(而且它们不应该很复杂),否则实际上节省时间的可能性很低
因此,使用done\u testing()
是一种折衷方法
use Test::More;
plan tests => $tests;
#----- load non-existant record -----
....
#----- add a new record -----
....
#----- load the new record (by name) -----
....
#----- verify the name -----
etc.