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