Как я могу протестировать автономный скрипт на Perl? - PullRequest
21 голосов
/ 22 января 2009

Я написал небольшой скрипт на Perl, и теперь я хотел бы создать для него набор тестов. Я подумал, что было бы неплохо иметь возможность use сценария как модуля, импортировать подпрограммы, определенные в сценарии, и протестировать их. Есть ли способ иметь скрипт как автономный скрипт Perl, так и модуль Perl? (Я не хочу разбивать скрипт на отдельный модуль и «исполняемый файл», поскольку я планирую распространять скрипт как один файл.)

Или есть лучший способ проверить скрипт?

Ответы [ 6 ]

32 голосов
/ 22 января 2009

Поскольку Брайан сейчас спит, вот указатель на то, что он называет modulinos . Это в основном рецепт для создания сценариев, которые действуют как модули или модули, которые можно запускать как сценарии. Звучит так же, как вы ищете.

Освоение Perl - определенно книга, которую стоит прочитать (и купить).

6 голосов
/ 22 января 2009

(Я не хочу разбивать скрипт на отдельный модуль и «исполняемый файл», так как планирую распространять скрипт как один файл.)

Большинство людей сшивают файлы вместе во время сборки. App :: Ack на CPAN является примером чего-то, что может быть построено следующим образом.

Если вы действительно хотите правильно протестировать свое приложение, вам нужно поместить функциональность в модуль, а затем написать тестовый скрипт на основе Test :: More, который выполняет функции, которые предоставляет модуль. Тогда реальный скрипт - это просто обертка вокруг модуля, обычно что-то вроде:

#!/usr/bin/env perl
use Your::Class;
Your::Class->new(args => \@ARGV)->run;

См. Также: MooseX :: Getopt .

3 голосов
/ 14 января 2011

Я хочу сделать то же самое. Есть ли причина не делать следующее? (Я не эксперт по Perl, хотя мне кажется, что решение работает нормально.):

в начале скрипта я спрашиваю переключатель ("-test") или что-то еще, а затем переход к подпрограмме, подобной этой:

my $myargs = CmdLineOptions->new( args=>\@ARGV );
if ($myargs->was_given(option=>"-test"))    { &tests; }

sub tests   {
    require "Test/More.pm";
    Test::More->import('no_plan');

    is(1,1,"my tests go here");
    exit;
}

(при использовании require и import я подавляю сообщение «# No tests run!», Которое я получаю при использовании «use Test :: More» без каких-либо тестов. Я думаю, это также снижает накладные расходы.)

2 голосов
/ 22 января 2009

Это зависит от того, хотите ли вы протестировать сам скрипт или протестировать подпрограммы, составляющие скрипт. Если вы хотите протестировать скрипт, то более подходящим будет внешний тест, например, скрипт оболочки. Если вы хотите протестировать функции, составляющие скрипт, то вы можете либо написать эти тесты в виде большего количества функций в скрипте, либо реорганизовать элементы в модуль Perl и протестировать модуль (что, как вы говорите, делать не нужно) .

Если скрипт достаточно маленький, рефакторинг может не понадобиться. Просто добавьте аргумент командной строки '-test' и вызовите тестовую подпрограмму, которая, в свою очередь, проверяет все остальное. При этом мне нравится распечатывать какой-либо индикатор прогресса (например, «.» Для каждого пройденного теста).

Если скрипт более сложный, вы можете рассмотреть возможность рефакторинга битов в один или несколько модулей и тестирования их с помощью Test :: Simple или Test :: More .

1 голос
/ 22 января 2009

Почему бы не написать набор тестов в сценарии оболочки, при этом сценарий Perl вызывается как любая другая команда оболочки?

0 голосов
/ 10 апреля 2019

Поскольку я просто хотел протестировать один сабвуфер, я использовал хакерское решение, заключающееся в извлечении этого сабвуфера в модуль с однострочным использованием perl, который прост для понимания и не требует установки каких-либо модулей (я извлекаю абзац с суб-именем, которое, конечно, хрупкое). Итак, в моем Makefile у меня есть:

MyModule.pm: my_script.pl
    perl -00 -lnE 'if(/^\s*sub my_sub \{/){say "package MyModule;";say;say "1;";}' my_script.pl >|MyModule.pm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...