Po realizacji smutny stan pokrycia kodu na naszych testów jednostkowych w pracy staram się stworzyć narzędzie, które skanuje Nasza baza kodu i flagi plików, które nie są na 100 %. Znalazłem dwa podejścia, które popadły wszystkich metod:lista metod/funkcji określonych wyraźnie w module Get
stół symbol dostęp bezpośrednio:
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";
}
}
pomocą modułu Class::Inspector
z CPAN:
for my $classname (@ARGV) {
my @methods = Class::Inspector->methods($classname, 'public');
print Dumper \@methods;
}
te dwa podejścia produkować podobne rezultaty; Problem z nich jest to, że wykazują one wszystkie metod dostępnych dla całego modułu, nie tylko metody zdefiniowane wewnątrz tego modułu.
Czy istnieje jakiś sposób, aby odróżnić metod dostępnych dla modułu i metody zdefiniowane jawnie wewnątrz modułu?
Uwaga: Ja nie próbuje utworzyć pełny test pokrycia kodu do mojego użytku przypadku Chcę po prostu sprawdzić, czy wszystkie metody zostały nazwane co najmniej raz. Pełne testy zasięgu, takie jak Devel::Cover
, są dla nas przesadą.
nie mogę zweryfikować to w tej chwili, ale myślę, że trzeba [ 'can'] (http://perldoc.perl.org/perlobj.html#The-UNIVERSAL- klasa): 'print "$ _ \ n" dla grep $ classname-> może ($ _), klucze% { "$ {} classname ::}"' – Zaid
Dzięki za komentarz, niestety 'can' wydaje się nadal spójrz na drzewo dziedziczenia. Nadal dostaję wpisy dla 'Dumper' i innych metod z niektórych naszych niestandardowych modułów. –
Można nazwać 'local @ PACKAGE :: NAME :: INC =();', a następnie wykonać sprawdzanie 'can()'. – frezik