Модуль .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
предоставляет возможность тестовому коду получить список функций, которые должны быть протестированы.