Perl 如何避免;你尝试了两次“计划”;测试:更多
我是单元测试新手。 我假装加载了N个类,这些类在内部使用目标中的Test::More来使用它们自己的封装进行不同的测试 但我发现了一个错误:“你在Tests/Bar.pm第9行尝试了两次计划。” 这种“多个测试”的方法是正确的,我的意思是它是用perl进行单元测试的标准方法?如何使用Test::More获得这种级别的封装 谢谢你的建议 main.pl:Perl 如何避免;你尝试了两次“计划”;测试:更多,perl,unit-testing,tdd,Perl,Unit Testing,Tdd,我是单元测试新手。 我假装加载了N个类,这些类在内部使用目标中的Test::More来使用它们自己的封装进行不同的测试 但我发现了一个错误:“你在Tests/Bar.pm第9行尝试了两次计划。” 这种“多个测试”的方法是正确的,我的意思是它是用perl进行单元测试的标准方法?如何使用Test::More获得这种级别的封装 谢谢你的建议 main.pl: use strict; use warnings; use utf8; use Tests::Foo; use Tests::Bar; m
use strict;
use warnings;
use utf8;
use Tests::Foo;
use Tests::Bar;
my $ret1 = Tests::Foo->run();
my $ret2 = Tests::Bar->run();
测试::Foo:
package Tests::Foo;
use strict;
use warnings;
sub run
{
my $ret;
use Test::More qw(no_plan);
my $test = Test::More->builder;
is(1,1,'correct()');
is(1,2,'fails()');
return $test;#return all test object
}
1;
测试::条
package Tests::Bar;
use strict;
use warnings;
sub run
{
my $ret;
use Test::More qw(no_plan);
my $test = Test::More->builder;
is(2,1,'fail()');
is(2,2,'correct()');
return $test;#return all test object
}
1;
Test::More
模块是围绕TAP格式()构建的。测试输出的第一行可以包含声明测试数量的行:1..12
。这对于输出成功或失败测试分数的工具非常有用:3/12测试失败
。但是,此行是可选的,您不能使用任何计划。在这种情况下,当您完成测试时,可以说:
use Test::More;
is 1, "1", "stringification";
done_testing;
请注意,use Test::More“no_plan”
被Test::More视为一个计划,尽管它没有在TAP输出中声明任何内容
您应该在每个流程中只声明一次计划(或声明您已完成)。这不是问题,因为测试通常是这样进行的:
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 1;
# some test here
BEGIN {
use_ok 'Foo::Bar';
}
lib/
,以及包含测试的文件夹t/
。下面是Foo::Bar
模块的示例:
./
lib/
Foo/
Bar.pm
Bar/
Helper.pm
t/
00_first_test.t
01_second_test.t
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 1;
# some test here
BEGIN {
use_ok 'Foo::Bar';
}
也就是说,它最好有一个shebang并声明测试的数量。不需要包名称prove
工具运行。在目录中:
$ prove -lr t/
-l
包括lib
目录,-r
也查看子文件夹。然后可以指定测试列表或包含测试的目录。目录中的测试通常是按字母顺序处理的,但也有一些选项可以激发这一点
这将为每个测试执行一个单独的过程。这是健壮的,易于实现和并行化,尽管性能不太好。这意味着每个测试负责创建自己的夹具 use Test::More tests => 2;
ok some_test;
subtest "Nice Name" => sub {
plan tests => 1;
ok other_test;
};
package Tests::Something;
use Test::More;
sub run {
my $self = shift;
plan tests => 2;
ok some_test;
ok other_test;
}
在子测试中,计划是使用plan
函数声明的,而不是使用use Test::More
(在执行子测试之前的编译时执行)!您可以将要执行的测试对象构造为子测试:
use Test::More tests => 2;
ok some_test;
subtest "Nice Name" => sub {
plan tests => 1;
ok other_test;
};
package Tests::Something;
use Test::More;
sub run {
my $self = shift;
plan tests => 2;
ok some_test;
ok other_test;
}
然后:
我需要去托儿所接我的儿子,但我会在我迅速返回后给你一个全面的答复。简短的回答是:使用子测试。好的,@amon已经打败了我。回答得很好,amon,非常感谢!我用子测验让玩具继续。