Как запустить тест в наборе тестов моего модуля Perl, только если установлен необходимый модуль? - PullRequest
5 голосов
/ 13 декабря 2011

Я хочу добавить тест для моего дистрибутива Perl, для которого требуется модуль Foo, но мой дистрибутив не требует Foo; только тест требует Foo. Поэтому я не хочу добавлять модуль в зависимости, но вместо этого я просто хочу пропустить тесты, которые требуют Foo, если Foo недоступен во время сборки.

Как правильно это сделать? Должен ли я просто обернуть свои тесты Foo в блок eval вместе с use Foo;, чтобы тесты не запускались, если загрузка Foo не удалась? Или есть более элегантный способ сделать это?

Ответы [ 4 ]

8 голосов
/ 13 декабря 2011

Если все тесты, требующие 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
}
6 голосов
/ 13 декабря 2011

Test :: More имеет возможность пропустить, если какое-либо условие не выполняется, см. Ниже

SKIP: {
    eval { require Foo };

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

    ## do something if Foo is installed
};
2 голосов
/ 13 декабря 2011

Также, объявляйте ваши требования или рекомендации по шагу теста (есть разница) в метафайле дистрибутива. Это будет подхвачено клиентом, выполняющим установку. Во время установки пользователь может решить, устанавливать ли такое требование навсегда или отменить его, потому что оно использовалось только для тестирования.

2 голосов
/ 13 декабря 2011

Из документации 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" );
}
...