2009-01-22 92 views
20

我寫了一個小的Perl腳本,現在我想爲它創建一個測試套件。我認爲能將use腳本作爲一個模塊,導入腳本中定義的潛艇並對其進行測試會很好。有沒有辦法讓腳本既是獨立的Perl腳本又是Perl模塊? (我不想劇本拆分成獨立的模塊和「可執行」,因爲我打算分發腳本爲單個文件。)如何測試獨立的Perl腳本?

還是有更好的方法來測試腳本?

回答

29

由於布賴恩似乎是睡着了,現在,這裏是一個指針,他所謂modulinos。這基本上是構建可以像腳本一樣運行的模塊或模塊的腳本的配方。聽起來完全像你正在尋找的東西。

Mastering Perl絕對是一本值得一讀的(和購買)。

+0

謝謝,這正是我一直在尋找的。 – zoul 2009-01-22 12:46:20

1

爲什麼不寫一個測試套件在一個shell腳本,與被稱爲像任何其他shell命令的Perl腳本?

+0

是的,這當然是一個選項,但直接使用subs對我來說似乎更方便。 – zoul 2009-01-22 11:29:17

6

(我不想劇本拆分成獨立的模塊和「可執行」,因爲我打算分發腳本爲單個文件。)

大多數人縫合在一起文件如這在構建時。 CPAN上的App :: Ack是一個可以像這樣構建的東西的例子。

如果你真的想測試你的應用程序正確,你需要把功能模塊中,然後寫一個測試::基於更多測試腳本,行使該模塊提供的功能。然後實際的腳本只是一個瘦包裝模塊周圍,通常是這樣的:

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

參見:MooseX::Getopt

2

這取決於你是否想測試腳本本身,或測試彌補了劇本的潛艇。如果你想測試腳本,那麼外部測試會更合適,例如,一個shell腳本。如果要測試組成該腳本的函數,則可以將這些測試作爲更多函數寫入腳本中,或者將這些元素重構爲Perl模塊並測試模塊(您稱之爲不想執行的模塊) 。

如果腳本足夠小,則重構可能不是必需的。只需添加一個'-test'命令行參數並調用一個測試子,然後再測試其他一切。如果這樣做,我喜歡打印某種進度指示器(例如,每次通過測試的'。')。

但是,如果腳本比較複雜,您可能需要考慮將位重構爲一個或多個模塊,並使用Test::SimpleTest::More進行測試。

3

我想要做同樣的事情。有沒有理由不這樣做? (我不是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; 
} 

(使用要求和進口我消息打壓使用時,我得到「使用測試::更多」沒有做任何測試「#沒有運行測試!」。我想這也減少了開銷。)