Perl Test ::更多并设置测试要求

时间:2010-09-07 18:29:44

标签: perl unit-testing testing catalyst

使用Test::More我经常想要一个运行测试的模块,并且能够中止调用者test_plan。我有一系列测试为Catalyst::Test设置了一个插件列表。我不想让我的测试检查它们是否存在;相反,如果那些插件不存在,我希望我的脚本中止。

我试图追踪Catalyst::Authentication::Store::DBI::ButMaintained中的错误,我注意到这个错误也出现在Catalyst::Authentication::Store::DBI中。这是:

eval {
  require Catalyst::Model::DBI;
  require Catalyst::Plugin::Session;
  require Catalyst::Plugin::Session::State::Cookie;
  require Catalyst::Plugin::Session::Store::File;
  require DBD::SQLite;
  require Test::WWW::Mechanize::Catalyst;
} or plan skip_all => $@;

...

$ENV{'TESTAPP_PLUGINS'} = [ qw(
  Authentication
  Session
  Session::Store::File
  Session::State::Cookie
  Authorization::Roles
) ];

正如您所看到的,eval/skip_all并未检查Authorization::Roles包含,但测试依赖于它,因为它是一个插件。

我还有另外一个问题 - 是否有更优雅的方式来指定测试依赖性?请记住,我的目标与原作者相同。如果测试要求不存在,我只想跳过测试。理想情况下,在这种情况下,我想破解Catalyst::Test来包装Catalyst::Plugin::*内容的插件机制,然后在没有eval/skip_all的情况下找到更好的方法来完成剩下的这些内容。

2 个答案:

答案 0 :(得分:1)

您可以通过调用以下方式动态影响计划中的测试次数:

Test::More->builder->plan(tests=>$total_tests);

您可以根据需要有条件地计算测试次数。

答案 1 :(得分:1)

根据需要更新您的插件列表:

如果您在一个单独的包中测试一堆需求,那么如果不满足依赖关系,您可以简单地让该包返回false(而不是传统的真值):

package Catalyst::Test;

eval {
    use Dep1;
    use Dep2;
    # ...
}

# dep check package returns true if we found all the modules
!$@;

# test.pl
use Test::Requires {
    Catalyst::Test => 0.01,  # skip all tests if Catalyst::Test is not present
};
use Test::More tests => 20;  # call Test::More as normal.

当我使用名为Foo的dep检查程序运行此程序时,会因适当的输出而失败:

% perl -I. foo.t
1..0 # SKIP Foo.pm did not return a true value at (eval 4) line 2.
# BEGIN failed--compilation aborted at (eval 4) line 2.
#
% prove -I. foo.t
foo.pl .. skipped: Foo.pm did not return a true value at (eval 4) line 2.
Files=1, Tests=0,  0 wallclock secs ( 0.02 usr  0.01 sys +  0.01 cusr  0.00 csys =  0.04 CPU)
Result: NOTESTS