Jak Mogę przetestować samodzielny skrypt Perla?

Napisałem mały skrypt Perla i teraz chciałbym stworzyć dla niego zestaw testów. Pomyślałem, że byłoby miło móc use skrypt jako moduł, zaimportować podpunkty zdefiniowane w skrypcie i przetestować je. Czy istnieje sposób, aby skrypt miał zarówno samodzielny skrypt Perla, jak i moduł Perla? (Nie chcę dzielić skryptu na osobny moduł i "wykonywalny", ponieważ planuję dystrybuować skrypt jako pojedynczy plik.)

A może jest lepszy sposób na przetestowanie skryptu?

Author: brian d foy, 2009-01-22

5 answers

Ponieważ brian wydaje się teraz spać, oto wskaźnik do tego, co nazywa modulinos . Jest to w zasadzie przepis na budowanie skryptów, które działają jak moduły lub moduły, które mogą być uruchamiane jak skrypty. Brzmi dokładnie tak, jak to, czego szukasz.

Mastering Perl to zdecydowanie książka warta przeczytania (i kupienia).

 32
Author: innaM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-14 14:39:21

(nie chcę dzielić skryptu na osobny moduł i "wykonywalny", ponieważ planuję dystrybuować skrypt jako pojedynczy plik.)

Większość ludzi zszywa pliki w ten sposób w czasie budowy. App:: Ack na CPAN jest przykładem czegoś, co można zbudować w ten sposób.

Jeśli naprawdę chcesz poprawnie przetestować swoją aplikację, musisz umieścić funkcjonalność w module, a następnie napisać skrypt testowy Test::More, który wykonuje funkcje, które moduł zapewnia. Następnie skrypt jest tylko cienką owijką wokół modułu, zwykle coś w stylu:

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

Zobacz także: MooseX:: Getopt.

 6
Author: jrockway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 19:00:18

Chcę zrobić to samo. Czy jest jakiś powód, aby nie robić następujących rzeczy? (Nie jestem ekspertem od Perla, rozwiązanie wydaje się działać dobrze dla mnie.):

Na początku skryptu proszę o Przełącznik ("- test") lub cokolwiek i wtedy rozgałęziam się na taki sub:

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;
}

(używając require i import tłumię ' # No tests run!'wiadomość, którą otrzymuję podczas korzystania z' use Test:: More ' bez wykonywania żadnych testów. Myślę, że to również zmniejsza koszty.)

 3
Author: Dirk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-14 11:21:06

To zależy od tego, czy chcesz przetestować sam skrypt, czy przetestować subs, które tworzą skrypt. Jeśli chcesz przetestować skrypt, wtedy bardziej odpowiedni byłby zewnętrzny test, np. skrypt powłoki. Jeśli chcesz przetestować funkcje, które składają się na skrypt, możesz albo napisać te testy jako więcej funkcji w skrypcie, albo refaktorować elementy do modułu Perla i przetestować moduł (o czym mówisz, że nie chcesz tego robić).

Jeśli skrypt jest wystarczająco mały, to refaktoryzacja może nie być konieczna. Wystarczy dodać argument wiersza poleceń '- test' i wywołać sub test, który z kolei testuje Wszystko inne. Jeśli to robisz, Lubię wydrukować wskaźnik postępu jakiegoś rodzaju (np. a '."za każdy test, który przejdzie).

Jeśli skrypt jest bardziej złożony, możesz rozważyć refaktoryzację bitów w jeden lub więcej modułów i przetestowanie ich za pomocą Test::Simplelub Test::More.

 2
Author: Joe Casadonte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 12:14:18

Dlaczego nie napisać pakietu testowego w skrypcie powłoki, ze skryptem Perla nazywanym jak każde inne polecenie powłoki ?

 1
Author: mouviciel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 22:51:06