Где я должен использовать общие функции утилиты для тестов Perl.t?

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

Ответ 1

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

Ответ 2

Лучшим подходом является включение ваших тестовых функций, как и любого другого набора функций, в модуль. Затем вы можете использовать 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;
}

В script:

use Test::More plan => 1;
use Test::YourModule qw(exitcode_ok);
exitcode_ok('date', 0, 'date exits without errors');