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

Perl 使用Test::More,如何在已测试函数中打印调试消息?,perl,Perl,我为函数foo编写了一些测试用例 一些测试用例失败,为了调试并发现问题,我希望在functionfoo中打印一些调试消息 我的尝试是: 打印到标准输出,后来我了解到Test::More不希望我修改标准输出 打印到stderr,当我执行make test 我学习了diagnote和explain,我在foo中做了diag('test'),但是消息没有打印出来。它们的示例表明,它们将在测试用例函数中使用 当我运行测试用例时,我真的想在我的foo中打印一条消息 那么,最正确的方法是什么呢?尝试写入

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

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

我的尝试是:

  • 打印到标准输出,后来我了解到
    Test::More
    不希望我修改标准输出
  • 打印到stderr,当我执行
    make test
我学习了
diag
note
explain
,我在
foo
中做了
diag('test')
,但是消息没有打印出来。它们的示例表明,它们将在测试用例函数中使用

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

那么,最正确的方法是什么呢?

尝试写入文件:

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

尽管如此,如果您在stderr上看不到输出,您的函数可能无法执行,但请谈谈关注点的错误分离。它看起来像:

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

...

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

感谢大家的关注

我终于明白了

在我的职责范围内

sub foo {
    diag('hahahah');
}
在我的测试中:

ok(Package::foo());
当我运行
perl Makefile.PL时,我没有看到“hahahaha”输出;进行测试

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

那为什么“哈哈哈”一开始没有打印出来呢

原因是。。。我没有
使用Test::More
foo
的包中。把线放进去后,我可以在输出中看到“哈哈哈”

我没有收到关于我正在使用的诊断未找到的警告:
$make test\u VERBOSE=1

您没有解释为什么不能使用
diag
?我以为
diag
只在测试用例函数中打印消息,但是我想在函数中打印消息,而不是在测试用例函数中。使用test::More tests=>1;sub foo(){print'hello,world';返回1;}ok(foo()等式1,'foo()等式1');打印1..1您好,worldok 1-foo()等式1。对于测试用例函数,我认为他指的是他的.t文件中的函数,他想显示来自测试用例函数正在测试的函数的消息。他想显示来自测试代码的消息,但他不能。他尝试了
diag()
,它可以工作,但在他测试的代码中无法访问,因为生产代码很少使用
测试::More
@HowardGuo-这是添加
使用Test::More的有效解决方案吗并使用
diag()