построение модуля Perl - PullRequest
       3

построение модуля Perl

4 голосов
/ 16 августа 2011

У меня есть модуль .pm, в котором пять функций, каждая функция возвращает 0 или 1, и я хочу добавить еще одну функцию, которая в будущем возвращает 0 или 1 (эти функции являются тестовыми функциями, 1 означает, что в порядке 0, означает, что произошла ошибка).

Хочу вызвать из скрипта те функции, которые основаны на модуле .pm.

Я хочу, чтобы мой скрипт вызывал каждую функцию в модуле .pm, если он возвращает 0, то для перехода к следующей функции. Если он возвращает 1, он должен что-то напечатать в LOG и прекратить обработку записи.

Предположим, я обновлю модуль .pm и добавлю в него новые функции. Можно ли сохранить код скрипта без каких-либо изменений? Я не хочу добавлять условие if каждый раз, когда добавляю тесты в модуль .pm?

1 Ответ

3 голосов
/ 16 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...