Perl 如何避免;你尝试了两次“计划”;测试:更多

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

我是单元测试新手。 我假装加载了N个类,这些类在内部使用目标中的Test::More来使用它们自己的封装进行不同的测试

但我发现了一个错误:“你在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();
测试::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并声明测试的数量。不需要包名称

  • 测试使用Perl附带的
    prove
    工具运行。在目录中:

    $ prove -lr t/
    
    -l
    包括
    lib
    目录,
    -r
    也查看子文件夹。然后可以指定测试列表或包含测试的目录。目录中的测试通常是按字母顺序处理的,但也有一些选项可以激发这一点

    这将为每个测试执行一个单独的过程。这是健壮的,易于实现和并行化,尽管性能不太好。这意味着每个测试负责创建自己的夹具

  • 因此,无需从中心测试脚本或生成文件调用测试

    如果要在同一TAP会话中执行多个测试,可以使用子测试:

     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,非常感谢!我用子测验让玩具继续。