如何在Test :: More中避免"你试图计划两次"

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)

amo*_*mon 9

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输出中声明任何内容.

您应该在每个流程中声明一个计划(或声明您已完成).这不是问题,因为通常测试如下:

  1. 在项目目录中,您拥有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)
  2. 测试看起来像这样:

    #!/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并声明测试次数.包名称不是必需的.

  3. 测试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)