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

Я начинаю с Тестом:: Больше, уже имейте несколько.t сценариев тестирования. Теперь я хотел бы определить функцию, которая будет только использоваться для тестов, но через различные.t файлы. Куда лучшее место должно поместить такую функцию? Определите другой.t без любых тестов и require это при необходимости? (Как заметка на полях я использую структуру модуля, созданную Модулем:: Начинающий)

10
задан brian d foy 14 May 2010 в 23:09
поделиться

2 ответа

Напишите модуль, как продемонстрировал 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 файл из вашего проекта, вам нужно переписать все его использования. Твой выбор.

9
ответ дан 3 December 2019 в 19:31
поделиться

Лучший подход - поместить ваши тестовые функции, как и любой другой набор функций, в модуль. Затем вы можете использовать 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');
11
ответ дан 3 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: