我想在我的Perl发行版中添加一个需要模块Foo的测试,但我的发行版不需要Foo;只有测试需要Foo。所以我不想将模块添加到依赖项中,而是我只想跳过需要Foo的测试,如果Foo在构建时不可用。
这样做的正确方法是什么?我是否应该将我的Foo测试与use Foo;
一起包装在eval块中,以便在加载Foo失败时测试不会运行?或者有更优雅的方式吗?
答案 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(有区别)。这将由执行安装的客户端获取。在安装时,用户可以决定是永久安装这样的要求还是丢弃它,因为它仅用于测试。