Nachdem ich den traurigen Zustand der Codeabdeckung bei unseren Komponententests bei der Arbeit erkannt habe, versuche ich ein Dienstprogramm zu erstellen, das unsere Codebasis scannt und Dateien ohne 100 markiert %. Ich fand zwei Ansätze, die alle Methoden erhalten:Liste der Methoden/Funktionen, die explizit in einem Modul definiert sind
Zugang Symboltabelle direkt:
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";
}
}
Verwenden Sie das Class::Inspector
Modul aus dem CPAN:
for my $classname (@ARGV) {
my @methods = Class::Inspector->methods($classname, 'public');
print Dumper \@methods;
}
diese beiden Ansätze produzieren ähnliche Ergebnisse; Das Problem mit diesen ist, dass sie alle der Methoden zeigen, die für das gesamte Modul verfügbar sind, nicht nur die Methoden innerhalb dieses Moduls.
Gibt es eine Möglichkeit, zwischen Methoden zu unterscheiden, die für ein Modul zugänglich sind, und Methoden, die explizit in einem Modul definiert sind?
Hinweis: Ich versuche nicht, einen vollständigen Code-Coverage-Test zu erstellen, für meinen Anwendungsfall möchte ich nur testen, ob alle Methoden mindestens einmal aufgerufen wurden. Vollständige Abdeckung Tests wie Devel::Cover
sind für uns Overkill.
ich das im Moment nicht verifizieren kann, aber ich glaube, Sie brauchen [ 'can'] (http://perldoc.perl.org/perlobj.html#The-UNIVERSAL- Class): 'print" $ _ \ n "für grep $ klassenname-> can ($ _), keys% {" $ {classname} ::} "' – Zaid
Danke für deinen Kommentar, leider 'can' scheint immer noch schaue den Vererbungsbaum an. Ich bekomme immer noch Einträge für 'Dumper' und andere Methoden von einigen unserer benutzerdefinierten Module. –
Sie könnten 'local @PACKAGE :: NAME :: INC =();' aufrufen und dann die 'can()' Prüfung durchführen. – frezik