Где я должен поставить общие функции утилит для Perl .t тестов? - PullRequest
10 голосов
/ 14 мая 2010

Я начинаю с Test :: More , уже есть несколько тестовых скриптов .t. Теперь я хотел бы определить функцию, которая будет использоваться только для тестов, но для разных файлов .t. Где лучшее место, чтобы поставить такую ​​функцию? Определите другой .t без каких-либо тестов и require это где необходимо? (В качестве идентификатора я использую структуру модуля, созданную Module :: Starter )

Ответы [ 2 ]

11 голосов
/ 14 мая 2010

Лучший подход - поместить ваши тестовые функции, как и любой другой набор функций, в модуль. Затем вы можете использовать Test :: Builder , чтобы ваши тестовые диагностические сообщения / сообщения об ошибках действовали так, как если бы ошибка возникла из файла .t, а не из вашего модуля.

Вот простой пример.

package Test::YourModule;

use Test::Builder;
use Sub::Exporter -setup => { exports => ['exitcode_ok'] };  # or 'use Exporter' etc.

my $Test = Test::Builder->new;

# Runs the command and makes sure its exit code is $expected_code. Contrived!
sub exitcode_ok {
    my ($command, $expected_code, $name) = @_;

    system($command);
    my $exit    = $? >> 8;
    my $message = $!;

    my $ok = $Test->is_num( $exit, $expected_code, $name );
    if ( !$ok ) {
        $Test->diag("$command exited incorrectly with the error '$message'");
    }

    return $ok;
}

В вашем скрипте:

use Test::More plan => 1;
use Test::YourModule qw(exitcode_ok);
exitcode_ok('date', 0, 'date exits without errors');
9 голосов
/ 14 мая 2010

Напишите модуль, как продемонстрировал rjh. Поместите его в t / lib / Test / YourThing.pm, тогда его можно загрузить как:

use lib 't/lib';
use Test::YourThing;

Или вы можете поместить его прямо в t / Test / YourThing.pm, назвать его package t::Test::YourThing и загрузить как:

use t::Test::YourThing;

Преимущество состоит в том, что нет необходимости записывать строку use lib в каждый тестовый файл и четко идентифицировать его как локальный тестовый модуль. Нижняя сторона загромождает т /, она не будет работать, если "." находится не в @INC (например, если вы запускаете свои тесты в режиме taint, но это можно обойти с помощью use lib "."), и если вы решите удалить файл .pm из своего проекта, вам придется переписать все использует. Ваш выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...