在工作中對我們的單元測試實現代碼覆蓋率的悲慘狀況,我想創建一個實用工具,將掃描我們的代碼庫和標記文件沒有100後%。我發現,得到所有的方法兩種方法:獲取的模塊中明確定義的方法/函數列表
訪問符號表直接:
for my $classname (@ARGV) {
eval "require $classname";
die "Can't load $classname $EVAL_ERROR"
if $EVAL_ERROR;
no strict 'refs';
METHODS:
for my $sym (keys %{ "${classname}::" }) {
next METHODS unless defined &{"${classname}::${sym}"};
print "$sym\n";
}
}
從CPAN使用Class::Inspector
模塊:
for my $classname (@ARGV) {
my @methods = Class::Inspector->methods($classname, 'public');
print Dumper \@methods;
}
這兩種方法產生類似的結果;這些問題在於它們顯示整個模塊可用方法的全部全部,而不僅僅是該模塊的內部的方法。
是否有某種方法來區分模塊可訪問的方法和模塊內部明確定義的方法?
注:我沒有嘗試創建一個完整的代碼覆蓋測試,對我的使用情況下,我只是想測試所有的方法被調用至少一次。像Devel::Cover
這樣的完整覆蓋測試對我們來說是過分的。
我不能在此刻驗證這一點,但我認爲你需要['can'](http://perldoc.perl.org/perlobj.html#The-UNIVERSAL-類): '打印 「$ _ \ n」 表示的grep $ classname->能($ _),鍵%{ 「$ {}類名::}」' – Zaid
感謝您的評論,可惜的是'can'似乎還在查找繼承樹。我仍然從我們的一些自定義模塊獲取'Dumper'和其他方法的條目。 –
你可以調用'local @PACKAGE :: NAME :: INC =();'然後執行'can()'檢查。 – frezik