2

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

一些测试用例失败,为了调试和发现问题,我希望在 function 中打印一些调试消息foo

我的尝试是:

  • 打印到stdout,后来才知道Test::More不想让我修改stdout。
  • 打印到stderr,执行时不显示我的消息make test

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

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

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

4

4 回答 4

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;
   ...
}

...

note奖励:您知道可以选择仅在错误时输出诊断信息,或者diag根据测试是否成功进行切换。

于 2012-10-21T04:34:08.523 回答
1

感谢大家的关注。

我终于想通了..

在我的功能中

sub foo {
    diag('hahahah');
}

在我的测试中:

ok(Package::foo());

我跑的时候没有看到'hahahaha'的输出perl Makefile.PL; make test

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

那为什么一开始没有打印出'hahahah'呢?

原因是……我use Test::More;的包里没有foo。将线放在那里后,我可以在输出中看到“哈哈哈”。

我没有收到关于diag not found.

于 2012-10-21T06:26:25.953 回答
0

尝试写入文件:

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

虽然,如果您在 stderr 上看不到输出,您的函数可能不会执行

于 2012-10-21T04:24:15.507 回答
0

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

于 2015-01-01T20:35:38.187 回答