测试::更多is_deeply在与字符串

时间:2016-11-13 02:08:45

标签: perl unit-testing tap

当Test :: More将arrayrefs和hashrefs相互比较时,相应的诊断消息确实提供了信息,并显示了结构不同的第一个索引,无论嵌套深度如何。但是,当它将arrayref或hashref与简单标量进行比较时,它会在诊断消息中生成一个字符串化的标量(带有内存地址和引用类型),这很难解释。

有没有办法以自定义方式(例如使用Data :: Dumper)将Test :: More配置为漂亮的打印数组或hashref?

这是一个包含两个测试用例的示例。第一部分让您深入了解程序中存在的内容,但却出乎意料。第二个通知用户字符串和arrayref之间的类型不匹配,但不会打印arrayref中的任何项目。

#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 2;

is_deeply(
    {
        a => [5],
    },
    {
        a => [5, 6, 8],
    },
    'compare two hashrefs structurally (very informative output)',
);

is_deeply(
    [5, 6, 8],
    "",
    'compare two "incompatible" values structurally (uninformative output)',
);

TAP输出:

1..2
not ok 1 - compare two hashrefs structurally (very informative output)
#   Failed test 'compare two hashrefs structurally (very informative output)'
#   at test-more-failure.pl line 6.
#     Structures begin differing at:
#          $got->{a}[1] = Does not exist
#     $expected->{a}[1] = '6'
not ok 2 - compare two "incompatible" values structurally (uninformative output)
#   Failed test 'compare two "incompatible" values structurally (uninformative output)'
#   at test-more-failure.pl line 16.
#     Structures begin differing at:
#          $got = ARRAY(0x7fe66b82cde8)
#     $expected = ''
# Looks like you failed 2 tests of 2.

在Test :: More中查看is_deeply的实现,似乎没有办法使用自定义漂亮的打印机或配置模块的详细程度。至少没有一个对我来说很明显。

以下是我们比较参考和非参考时会发生的情况:

https://metacpan.org/source/EXODIST/Test-Simple-1.302062/lib/Test/More.pm#L1121

似乎是在调用_format_stack({vals => [...]})而不是_format_stack(...)

https://metacpan.org/source/EXODIST/Test-Simple-1.302062/lib/Test/More.pm#L1139

2 个答案:

答案 0 :(得分:9)

tl; dr 根据具体情况使用is_deeply($this, $that) || diag explain $this

您好。 I'm the one to blame for is_deeply。它故意设计为在出现故障时不会呕吐出潜在的巨大数据结构。相反,它停在第一个区别。出于这个原因,您可能不希望全局使is_deeply转储其参数。如果这些类型是错误的,如果你期望苹果和斑马,那么知道有多少斑马和它们的生活故事就没什么意义了。

没有受支持的方法可以更改其诊断信息,抱歉,并且不太可能。 Test :: More正被Test2取代。 Test :: More已经在Test2之上实现,但由于向后兼容性的原因,它没有利用它的功能。

您可以使用Test2::Bundle::More更直接地访问Test2的功能,但它不是100%兼容,并且显示类似于is_deeply的功能。但是,它更加灵活,您可以找到一种方法来改变其诊断行为。查看Test2::Compare

回到你的问题......根据具体情况使用explainexplain使用正确配置的Data :: Dumper来转储数据结构。由于Test :: More函数返回它们是通过还是失败,因此您可以编写is_deeply($this, $that) || diag explain $this。例如......

my $stuff = [5, 6, 8];
is_deeply $stuff, "" || diag explain $stuff;

not ok 2
#   Failed test at /Users/schwern/tmp/test.plx line 17.
#     Structures begin differing at:
#          $got = ARRAY(0x7f80b3803078)
#     $expected = ''
# [
#   5,
#   6,
#   8
# ]

diag是您打印故障诊断的方式(它是一种更礼貌的方式来打印到STDERR)。

答案 1 :(得分:1)

Test::Differences尝试eq_or_diff( $got, $expected, $message ),它会打印出数据结构的精美表示,并清楚地突出显示相似点和不同点。