Perl测试-测试的公共父级

时间:2018-11-10 03:20:49

标签: perl unit-testing testing

我有一组测试,总是命名为Module.t,每个测试都是这样开始的:

use 5.026;
use strict;
use warnings;

use Test::Perl::Critic (-severity => 3);
use Module::Path 'module_path';
use Test::More tests => 8;
use Test::Log4perl;
Test::Log4perl->suppress_logging;

BEGIN { use_ok("My::Module") }
critic_ok(module_path("My::Module"));

... actual tests for this module ...

之所以这样,是因为一堆模块的代码编写得不太好,并且为了在我们进行重构时努力重构,我试图随着时间的推移为各个模块编写测试。例如。我不能对所有来源都启用Perl :: Critic,因为它会炸掉我的脸。

理想情况下,我想对所有这些进行“父”测试,以便当我或其他开发人员想要编写新测试时,他们始终拥有所有必需的东西。像这样:

use 5.026;
use strict;
use warnings;

# 6 tests because 2 (use_ok and critic_ok) are already in the parent
use parent ParentTest("My::Module", tests => 6);

... actual tests for this module ...

perl有办法吗?

免责声明:我是perl菜鸟,所以也许这有更好的解决方法:-)

1 个答案:

答案 0 :(得分:4)

听起来像您只需要一个帮助程序模块,该模块可以加载其他模块并为您运行一些初始测试。

类似的东西:

# ParentTest.pm
package ParentTest;
use strict;
use warnings;

use Test::Perl::Critic (-severity => 3);
use Module::Path 'module_path';
use Test::More;
use Test::Log4perl;

sub import {
    my (undef, $module, %args) = @_;

    $args{tests} += 2;

    plan %args;
    Test::Log4perl->suppress_logging;
    use_ok $module;
    critic_ok module_path $module;

    @_ = 'Test::More';
    goto +Test::More->can('import');
}

1

用法是:

use ParentTest "My::Module", tests => 6;

这都是未经测试的,但想法是:

  • 我们要运行一些代码来设置初始测试计划并运行一些测试。
  • 我们还希望导出Test::More导出的所有内容,因此我们的呼叫者不必自己use Test::More
  • use Some::Module @args等效于BEGIN { require "Some/Module.pm"; Some::Module->import(@args); },因此我们可以将自定义逻辑放入import方法中。
  • 我们首先忽略第一个参数(由于import被称为类方法,所以它是类名),然后将其余的参数分配给$module%args
  • 我们将$args{tests}加2以说明我们自动执行的两个额外测试(如果未通过tests,则会在此处隐式创建)。
  • 我们将%args传递给plan from Test::More,这很适合在初始use行之外设置测试计划。
  • 我们执行初始测试。
  • 我们尾部调用Test::More::import,删除了自己的堆栈帧。这看起来就像我们的调用者所做的Test::More->import(),将所有Test::More实用程序函数导出到它们。
  • +中的一元goto +Test::More->...并没有实际作用,但是有助于区分goto LABELgoto EXPRESSION语法形式。我们需要后一种解释。