jor*_*dor 2 tdd perl unit-testing
我是单元测试的新手.我假装加载内部使用Test :: More的N个类,用自己的封装进行不同的测试.
但是我接受了这个错误:"你试图在Tests/Bar.pm第9行计划两次."
这种"多个测试"的方法是正确的,我的意思是它是在perl中进行单元测试的标准方法吗?如何使用Test :: More获得这种级别的封装?
谢谢你的建议!
main.pl:
use strict;
use warnings;
use utf8;
use Tests::Foo;
use Tests::Bar;
my $ret1 = Tests::Foo->run();
my $ret2 = Tests::Bar->run();
Run Code Online (Sandbox Code Playgroud)
测试:: 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;
Run Code Online (Sandbox Code Playgroud)
测试::酒吧
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;
Run Code Online (Sandbox Code Playgroud)
该Test::More模块围绕TAP格式(Test Anything Protocol)构建.测试输出的第一行可以包含一行声明测试次数:1..12.这对于输出成功或失败测试部分的工具很有用:3/12 tests failed.但是,此行是可选的,您不能使用任何计划.在这种情况下,说出你的时间是有意义的done_testing:
use Test::More;
is 1, "1", "stringification";
done_testing;
Run Code Online (Sandbox Code Playgroud)
注意,use Test::More 'no_plan'它被Test :: More视为一个计划,尽管它没有在TAP输出中声明任何内容.
您应该在每个流程中声明一个计划(或声明您已完成).这不是问题,因为通常测试如下:
在项目目录中,您拥有lib/包含模块的文件夹以及t/测试.这是Foo::Bar模块的一个例子:
./
lib/
Foo/
Bar.pm
Bar/
Helper.pm
t/
00_first_test.t
01_second_test.t
Run Code Online (Sandbox Code Playgroud)测试看起来像这样:
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 1;
# some test here
BEGIN {
use_ok 'Foo::Bar';
}
Run Code Online (Sandbox Code Playgroud)
也就是说,它最好有一个shebang并声明测试次数.包名称不是必需的.
测试prove使用Perl附带的工具运行.在目录内:
$ prove -lr t/
Run Code Online (Sandbox Code Playgroud)
在-l包括lib目录,-r还着眼于子文件夹.然后,您可以指定包含测试的测试或目录列表.目录中的测试通常按字母顺序处理,但有一些选项可以激起它.
这将为每个测试执行单独的过程.这是强大的,易于实现和并行化,虽然不是非常高效.这意味着每个测试都负责创建它自己的夹具.
因此,没有必要从中央测试脚本或makefile调用您的测试.
如果要在同一TAP会话中执行多个测试,可以使用子测试:
use Test::More tests => 2;
ok some_test;
subtest "Nice Name" => sub {
plan tests => 1;
ok other_test;
};
Run Code Online (Sandbox Code Playgroud)
分测验内部,该计划宣布与plan功能,不具有use Test::More(这将在编译时,执行执行分测验之前)!您可以构建要作为子测试执行的测试对象:
package Tests::Something;
use Test::More;
sub run {
my $self = shift;
plan tests => 2;
ok some_test;
ok other_test;
}
Run Code Online (Sandbox Code Playgroud)
然后:
subtest "Tests::Something" => sub {
Tests::Something->new->run;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
610 次 |
| 最近记录: |