【问题标题】:How can I run a test in my Perl module's test suite only if the required module is installed?仅当安装了所需的模块时,如何在我的 Perl 模块的测试套件中运行测试?
【发布时间】:2011-12-13 05:42:19
【问题描述】:

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

这样做的正确方法是什么?我是否应该将我的 Foo 测试与use Foo; 一起包装在一个 eval 块中,这样如果加载 Foo 失败,测试就不会运行?还是有更优雅的方法?

【问题讨论】:

  • 你用的是什么测试模块?
  • 我正在使用 Test::More,但如果它具有此功能,请随意推荐另一个。
  • 看看下面的答案,但是阅读你正在使用的模块的旧的好文档应该是第一个选择:-)
  • 是的,一旦我知道我想要的功能被称为“跳过”,我就在文档中找到了它。我正在寻找更复杂的东西,比如“条件执行”。

标签: perl testing perl-module


【解决方案1】:

如果需要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; 这样的测试计数,那么如果 require 确实成功,您还需要安排执行 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
}

【讨论】:

    【解决方案2】:

    如果某些条件不满足,Test::More 可以选择跳过,见下文

    SKIP: {
        eval { require Foo };
    
        skip "Foo not installed", 2 if $@;
    
        ## do something if Foo is installed
    };
    

    【讨论】:

    • 漂亮而简单。现在我知道了 Test::More 中的“跳过”功能,我在文档中找到了关于它的部分。谢谢!
    • eval { require Foo } or skip ... ;
    【解决方案3】:

    来自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" );
    }
    

    【讨论】:

      【解决方案4】:

      此外,发行版元文件中的declare your test step requirement or recommendation(存在差异)。这将由执行安装的客户端获取。在安装时,用户可以决定是永久安装还是放弃它,因为它只是用于测试。

      【讨论】:

      • 看来Test::More::skip 方法和您的回答是互补的。 skip 函数允许我跳过需要不可用模块的测试,而您的回答允许我建议客户端安装模块而不使其成为硬依赖。如果正在安装我的 dist 的客户端决定不安装可选的测试依赖项,它会跳过 all 测试吗?或者它会以某种方式知道哪些测试依赖于该可选模块并自动跳过那些?
      • 或者,更简单地说,声明一个可选依赖项绝对是我会做的事情,但我看不出它如何让我摆脱处理该可选模块的情况的义务未安装。
      • 不完全是,如果是测试需求,那么它可用。但是我现在意识到这不是问题所在,我误解了您对可选的含义。你是对的,在这种情况下跳过检查是必要的;我编辑了答案。
      猜你喜欢
      • 2012-03-22
      • 2013-07-09
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 2014-10-19
      • 2013-04-09
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多