Да, это, безусловно, вариант, но мне напрямую удобнее использовать сабвуферы.

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

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

Ответы на вопрос(5)

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

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

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

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

Смотрите также:MooseX :: Getopt.

Решение Вопроса

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

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

 Joe Casadonte22 янв. 2009 г., 21:16
Я думаю, что есть удобство в том, чтобы заставить модуль действовать как скрипт, но я не вижу смысла в том, чтобы заставить скрипт действовать как модуль. По крайней мере, пока ....
 zoul22 янв. 2009 г., 13:46
Спасибо, это именно то, что я искал.
 Paul Nathan27 июл. 2009 г., 23:58
Приятно. Это помогло мне.
 brian d foy22 янв. 2009 г., 23:50
Не спит, просто работает :) Преимущество наличия скрипта в качестве модуля состоит в том, что вы можете разбить его на части для модульного тестирования. В противном случае вам достаточно запустить весь сценарий.
 innaM22 янв. 2009 г., 21:37
Ответ в вопросе (не ваш вопрос, а оригинальный). Модульное тестирование модуля намного проще, чем юнит-тестирование скрипта

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

 zoul22 янв. 2009 г., 12:29
Да, это, безусловно, вариант, но мне напрямую удобнее использовать сабвуферы.

эксперт по 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» без каких-либо тестов. Я думаю, это также уменьшает накладные расходы.)

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

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

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

Ваш ответ на вопрос