gpt4 book ai didi

perl - 如何在测试中避免 "You tried to plan twice"::More

转载 作者:行者123 更新时间:2023-12-01 16:49:02 25 4
gpt4 key购买 nike

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

但我收到错误消息:“您尝试在 Tests/Bar.pm 第 9 行计划两次。”

这种“不止一个测试”的方法是正确的,我的意思是它是在 perl 中进行单元测试的标准方法?我如何使用 Test::More 获得这种级别的封装?

多谢指教!

主.pl :

use strict;
use warnings;
use utf8;


use Tests::Foo;
use Tests::Bar;

my $ret1 = Tests::Foo->run();
my $ret2 = Tests::Bar->run();

测试::富:

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 格式构建的 (Test Anything Protocol)。测试输出的第一行可以包含声明测试次数的行:1..12。这对于输出成功或失败测试分数的工具很有用:3/12 tests failed。但是,此行是可选的,您可以不使用任何计划。在这种情况下,当您done_testing 时说:

use Test::More;

is 1, "1", "stringification";

done_testing;

请注意 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
  2. 测试如下所示:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    use Test::More tests => 1;

    # some test here
    BEGIN {
    use_ok 'Foo::Bar';
    }

    也就是说,它最好有一个 shebang 并声明测试的数量。不需要包名称。

  3. 测试是使用 Perl 附带的 prove 工具运行的。目录内:

    $ prove -lr t/

    -l 包括lib 目录,-r 也查看子文件夹。然后您可以指定测试列表或包含测试的目录。目录中的测试通常按字母顺序处理,但也有一些选项可以将其调高。

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

因此没有必要从中央测试脚本或 makefile 调用您的测试。

如果你想在同一个 TAP session 中执行多个测试,你可以使用子测试:

 use Test::More tests => 2;

ok some_test;

subtest "Nice Name" => sub {
plan tests => 1;
ok other_test;
};

在子测试中,计划是使用 plan 函数声明的,不是 use Test::More (它将在编译时间,在执行子测试之前)!您可以构建要作为子测试执行的测试对象:

package Tests::Something;
use Test::More;

sub run {
my $self = shift;
plan tests => 2;
ok some_test;
ok other_test;
}

然后:

subtest "Tests::Something" => sub {
Tests::Something->new->run;
}

关于perl - 如何在测试中避免 "You tried to plan twice"::More,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21626659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com