我有一個.pm模塊,每個函數都有五個函數返回0或1,我想添加另一個函數來重新構造0或1(這些函數是測試函數1意味着錯誤0意味着失敗)。構建一個perl模塊
我想從腳本中調用那些建立在.pm模塊上的函數。
我想讓我的腳本調用.pm模塊上的每個函數,如果它返回0然後繼續下一個函數。如果它返回1,那麼它應該向LOG打印一些東西並停止處理記錄。
假設我將更新.pm模塊並添加新的函數,是否可以保持腳本代碼沒有任何改變?每次向.pm模塊添加測試時,我都不想添加if條件?
我有一個.pm模塊,每個函數都有五個函數返回0或1,我想添加另一個函數來重新構造0或1(這些函數是測試函數1意味着錯誤0意味着失敗)。構建一個perl模塊
我想從腳本中調用那些建立在.pm模塊上的函數。
我想讓我的腳本調用.pm模塊上的每個函數,如果它返回0然後繼續下一個函數。如果它返回1,那麼它應該向LOG打印一些東西並停止處理記錄。
假設我將更新.pm模塊並添加新的函數,是否可以保持腳本代碼沒有任何改變?每次向.pm模塊添加測試時,我都不想添加if條件?
.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
提供了測試代碼來獲得的功能列表的方式應該進行測試。
這聽起來像一個簡單的測試框架/線束,你看看[Test :: Simple](http://search.cpan.org/~mschwern/Test-Simple-0.98/lib/Test/Simple.pm )而不是? 該模塊似乎完全符合您的要求,但通過稍後使用它,您可以移動到Test :: More並獲得其他功能。 – Panky
看到這個線程http://stackoverflow.com/questions/607282/whats-the-best-way-to-discover-all-subroutines-a-perl-module-has – bpgergo
你想獲取所有子程序的名稱模塊? –