Я начинаю с Тестом:: Больше, уже имейте несколько.t сценариев тестирования. Теперь я хотел бы определить функцию, которая будет только использоваться для тестов, но через различные.t файлы. Куда лучшее место должно поместить такую функцию? Определите другой.t без любых тестов и require
это при необходимости? (Как заметка на полях я использую структуру модуля, созданную Модулем:: Начинающий)
Напишите модуль, как продемонстрировал rjh. Поместите его в t / lib / Test / YourThing.pm, затем его можно будет загрузить как:
use lib 't/lib';
use Test::YourThing;
Или вы можете поместить его прямо в t / Test / YourThing.pm, назовите его пакетом t :: Test :: YourThing
и загрузите его как:
use t::Test::YourThing;
Положительным моментом является отсутствие необходимости писать строку use lib
в каждом тестовом файле и четко определять его как локальный тестовый модуль. Нижняя сторона загромождена т /, не получится, если "." отсутствует в @INC
(например, если вы запускаете свои тесты в режиме заражения, но это можно обойти с помощью , используйте lib "."
), и если вы решите переместить .pm файл из вашего проекта, вам нужно переписать все его использования. Твой выбор.
Лучший подход - поместить ваши тестовые функции, как и любой другой набор функций, в модуль. Затем вы можете использовать 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');