我有一组测试,总是命名为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菜鸟,所以也许这有更好的解决方法:-)
答案 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 LABEL
和goto EXPRESSION
语法形式。我们需要后一种解释。