我有一个 .pm 模块,它有五个函数,每个函数返回 0 或 1,我想添加另一个函数,将来返回 0 或 1(这些函数是测试函数 1 表示正常 0 表示失败)。
我想从脚本调用那些建立在 .pm 模块上的函数。
我希望我的脚本调用 .pm 模块上的每个函数,如果它返回 0 然后继续执行下一个函数。如果它返回 1 那么它应该打印一些东西到 LOG 并停止处理记录。
假设我将更新 .pm 模块并为其添加新功能,是否可以保留脚本代码而不做任何更改?我不想每次向 .pm 模块添加测试时都添加 if 条件?
最佳答案
.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;
}
尽管如此,契约(Contract)还是一样的:
MyModule
为测试代码提供了一种获取应该测试的函数列表的方法。
关于perl - 构建 perl 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071522/