【问题标题】:building a perl module构建 perl 模块
【发布时间】:2011-08-16 09:37:50
【问题描述】:

我有一个 .pm 模块,它有五个函数,每个函数返回 0 或 1,我想添加另一个函数,将来返回 0 或 1(这些函数是测试函数,1 表示正常,0 表示失败)。

我想从脚本中调用那些建立在 .pm 模块上的函数。

如果我的脚本返回 0,我希望我的脚本调用 .pm 模块上的每个函数,然后继续执行下一个函数。如果它返回 1 那么它应该打印一些东西到 LOG 并停止处理记录。

假设我将更新 .pm 模块并为其添加新功能,是否可以保留脚本代码而不做任何更改?我不想每次向 .pm 模块添加测试时都添加 if 条件?

【问题讨论】:

  • 这听起来像是一个简单的测试框架/线束,你看过Test::Simple 吗?该模块似乎完全符合您的要求,但通过稍后使用它,您可以转到 Test::More 并获得其他功能。
  • 是否要获取模块中所有子程序的名称?

标签: perl design-patterns


【解决方案1】:

.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 为测试代码提供了一种获取应测试函数列表的方法。

【讨论】:

  • 嗨 IF $full_name->(@params) get @params as non empty array 为什么我不能使用真正的函数
  • @sam - 我不确定你想说什么/问什么
猜你喜欢
  • 2018-11-06
  • 1970-01-01
  • 2020-08-04
  • 2012-05-28
  • 1970-01-01
  • 2013-05-20
  • 2020-08-11
  • 2010-10-07
  • 2011-05-07
相关资源
最近更新 更多