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