gpt4 book ai didi

perl - 如何调试由 Module::Starter 制作的模块?

转载 作者:行者123 更新时间:2023-11-28 19:48:43 26 4
gpt4 key购买 nike

我正在练习使用 Module::Starter 创建一个新模块。我为一个包写了几个测试用例,它们有时运行正常。

但是我注意到有两个问题:

  • 当测试用例失败时,我想在被测函数中加入一些打印语句。我运行了 make test,它只告诉我我的测试用例失败了,它没有显示我的打印输出,尽管我确实确定打印语句已到达。

  • 假设我有 3 个测试用例来测试一个函数,我在函数中放了一个 print 语句,当测试用例运行时,它报告说三个测试用例中只有 1 个被运行。如果我删除打印语句,所有三个测试用例都会运行。这是为什么?

这是我的代码:

# package declaration and stuff...
sub get_in {
my ( $hash, @path ) = @_;
my $ref = $hash;
print 'lol'; # This is the troublesome print statement. Remove this statement and all three test cases will run and pass
foreach (@path) {
if ( ref($ref) eq 'HASH' && exists $ref->{$_} ) {
$ref = $ref->{$_};
} else {
return undef;
}
}
return $ref;
}

这是测试用例:

use Test::More tests => 3;
use strict;
use warnings;
use diagnostics;
require_ok('Foo::Doc');
ok( Foo::Doc::get_in( { 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c' ) == 101 );
ok( @{ Foo::Doc::get_in( { 'a' => { 'b' => { 'c' => [ 1, 2, 3 ] } } }, 'a', 'b', 'c' ) } == @{ [ 1, 2, 3 ] } );

最佳答案

您的测试以及您的问题本身都存在一些需要解决的问题。首先你的问题:

如果您希望输出显示在测试中,您需要显式打印到标准错误。作为最佳实践,您还需要在输出前加上 #Test::More模块提供了可用于轻松执行此操作的工具。

my $got = Foo::Doc::get_in( { 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c' );
ok($got == 101); # you probably want is() instead, see below
diag("GOT $got"); # outputs "# GOT 101" or whatever to STDERR

如果您不想每次都打印该输出,而只是在请求详细日志记录时才打印,您可以使用note:

note("GOT $got");

这在您使用 prove -v 运行测试时很有用:

prove -l -v t/test.t

还有一个 explain 函数可以输出复杂的输出以供查看:

diag explain $got;
# OR
note explain $got;

至于你的其他问题。通常最好使用 is() 而不是 ok():

is($got, 101); # gives slightly more readable output on error

此外,在测试复杂数据结构时,您需要使用 is_deeply() 进行完整比较:

is_deeply($got, [1, 2, 3]);

你绝对应该看看 Test::More 的文档因为里面有很多有用的信息。

关于perl - 如何调试由 Module::Starter 制作的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12099879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com