使用Test :: More,如何在我测试的函数中打印出调试消息?

时间:2012-10-21 02:09:11

标签: perl

我为函数foo编写了一些测试用例。

有些测试用例失败,为了调试并找到问题,我希望在函数foo中打印一些调试消息。

我的尝试是:

  • 打印到标准输出,后来我了解到Test::More不希望我修改标准输出。
  • 打印到stderr,执行make test
  • 时,我的消息不会显示

我了解了diag noteexplain,我在diag('test')内做了foo但是没有打印消息。它们的示例表明它们将在测试用例函数中使用。

当我为它运行测试用例时,我真的想在我的foo中打印一条消息!

那么实现这一目标的最正确方法是什么?

4 个答案:

答案 0 :(得分:1)

ug,谈谈关注点分离不好。它看起来像是:

package My::Module;

sub some_func {
   ...
   Test::More::diag(...) if defined(&Test::More::diag);
   ...
}

...

我更喜欢创建一种机制来将数据传递给调用者。我曾经使用调试钩子来实现类似的东西。

{
   my $diag;
   local $My::Module::DEBUG_HOOK = sub {
      my (...) = @_;
      $diag = ...;
   };

   is(My::Module::some_func(...), ..., ...)
      or diag($diag);
}

该模块看起来像:

package My::Module;

our $DEBUG_HOOK;

sub some_func {
   ...
   $DEBUG_HOOK->(...) if $DEBUG_HOOK;
   ...
}

...

奖励:您知道可以选择仅输出有关错误的诊断信息,或者根据测试是否成功在notediag之间切换。

答案 1 :(得分:1)

感谢大家的关注。

我终于明白了......

在我的功能中

sub foo {
    diag('hahahah');
}

在我的测试中:

ok(Package::foo());

当我跑perl Makefile.PL; make test

时,我没有看到'hahahaha'的输出

我阅读了Test :: More的perldoc并注意到diag / note的示例用法来自测试文件,而不是来自测试函数,这让我有点困惑:我认为diag / note只能用于测试用例,而不是测试功能。

那为什么'hahahah'首先没有打印出来?

原因是......我在use Test::More;的包裹中没有foo。把线放到那里后,我可以在输出中看到'hahahah'。

我没有收到关于diag not found的警告。

答案 2 :(得分:0)

尝试写入文件:

open my $fh, '>>', '/tmp/test.log';
  print $fh "my awesdome message\n";
close $fh;

但是,如果在stderr

上没有看到输出,则可能无法执行您的功能

答案 3 :(得分:0)

我正在使用: $ make test TEST_VERBOSE = 1