2011-08-15 119 views
4

我有一個.pm模塊,每個函數都有五個函數返回0或1,我想添加另一個函數來重新構造0或1(這些函數是測試函數1意味着錯誤0意味着失敗)。構建一個perl模塊

我想從腳本中調用那些建立在.pm模塊上的函數。

我想讓我的腳本調用.pm模塊上的每個函數,如果它返回0然後繼續下一個函數。如果它返回1,那麼它應該向LOG打印一些東西並停止處理記錄。

假設我將更新.pm模塊並添加新的函數,是否可以保持腳本代碼沒有任何改變?每次向.pm模塊添加測試時,我都不想添加if條件?

+1

這聽起來像一個簡單的測試框架/線束,你看看[Test :: Simple](http://search.cpan.org/~mschwern/Test-Simple-0.98/lib/Test/Simple.pm )而不是? 該模塊似乎完全符合您的要求,但通過稍後使用它,您可以移動到Test :: More並獲得其他功能。 – Panky

+1

看到這個線程http://stackoverflow.com/questions/607282/whats-the-best-way-to-discover-all-subroutines-a-perl-module-has – bpgergo

+0

你想獲取所有子程序的名稱模塊? –

回答

3

.pm模塊應提供一種方法來檢索要測試的函數列表。

我認爲最好的方法是將其作爲子程序調用,但也可以使用包中定義的變量(例如列表變量)。

例子:

package MyModule; 

sub testable_functions { qw(fun1 fun2 fun3) } 
sub fun1 { ... } 
sub fun2 { ... } 
sub fun3 { ... } 
sub not_going_to_be_tested { ... } 

或:

package MyModule; 
our @testable_functions = qw(fun1 fun2 fun3); 

在您的測試代碼:

my @funs_to_be_tested = MyModule->testable_functions; 
# or = @MyModule::testable_functions if you're using a list 

for my $fun (@funs_to_be_tested) { 
    my $full_name = "MyModule::" . $fun; 
    $full_name->() or die "function $full_name failed\n"; 
} 

現在你可以添加功能,而無需改變你的測試代碼進行測試。

如果你想獲得幻想,你可以通過包的符號表中翻找:

package MyModule; 

sub testable_functions { 
    my @funs; 
    for my $name (keys %MyModule::) { 
    next if $name eq "testable_functions"; # can add more conditions here 
    my $full_name = "MyModule::".$name; 
    next unless *{$full_name}{CODE};  # avoid non-subs 
    push(@funs, $name); 
    } 
    return @funs; 
} 

儘管如此,合同是一樣的:MyModule提供了測試代碼來獲得的功能列表的方式應該進行測試。

+0

嗨IF $ full_name - >(@ params)獲取@params作爲非空數組爲什麼我不能在真正的功能 – sam

+0

@sam - 我不知道你想說什麼/問 – ErikR