如果安装了所需的模块,我怎样才能在Perl模块的测试套件中运行测试?

时间:2011-12-13 05:42:19

标签: perl testing perl-module

我想在我的Perl发行版中添加一个需要模块Foo的测试,但我的发行版不需要Foo;只有测试需要Foo。所以我不想将模块添加到依赖项中,而是我只想跳过需要Foo的测试,如果Foo在构建时不可用。

这样做的正确方法是什么?我是否应该将我的Foo测试与use Foo;一起包装在eval块中,以便在加载Foo失败时测试不会运行?或者有更优雅的方式吗?

4 个答案:

答案 0 :(得分:8)

如果需要Some::Module的所有测试都在一个文件中,那么很容易做到:

use Test::More;

BEGIN {
    eval {
        require Some::Module;
        1;
    } or do {
        plan skip_all => "Some::Module is not available";
    };
}

(如果您使用的测试次数为use Test::More tests => 42;,那么如果要求 成功,您还需要安排plan tests => 42;。)

如果它们是包含其他内容的文件中的较少数量的测试,那么您可以执行以下操作:

our $HAVE_SOME_MODULE = 0;

BEGIN {
    eval {
        require Some::Module;
        $HAVE_SOME_MODULE = 1;
    };
}

# ... some other tests here

SKIP: {
    skip "Some::Module is not available", $num_skipped unless $HAVE_SOME_MODULE;
    # ... tests using Some::Module here
}

答案 1 :(得分:6)

测试::如果不满足某些条件,则可以选择跳过,参见下面的

SKIP: {
    eval { require Foo };

    skip "Foo not installed", 2 if $@;

    ## do something if Foo is installed
};

答案 2 :(得分:2)

来自Test::More的文档:

SKIP: {
    eval { require HTML::Lint };
    skip "HTML::Lint not installed", 2 if $@;
    my $lint = new HTML::Lint;
    isa_ok( $lint, "HTML::Lint" );
    $lint->parse( $html );
    is( $lint->errors, 0, "No errors found in HTML" );
}

答案 3 :(得分:2)

此外,发行版元文件中的declare your test step requirement or recommendation(有区别)。这将由执行安装的客户端获取。在安装时,用户可以决定是永久安装这样的要求还是丢弃它,因为它仅用于测试。