gpt4 book ai didi

perl - 如何使用 Test::more 忽略 perl 中的 TAP 结果?

转载 作者:行者123 更新时间:2023-12-02 02:12:05 26 4
gpt4 key购买 nike

我想利用这个库来漂亮地打印我的测试的差异 Test::Differences; 但我不想将其计入我的计划中,因为这仅用于调试在我的用例中。

所以我创建了这个问题的一个最小示例来重现这个问题,我知道这样做不是“正确的”,但它很好地说明了问题。

use strict;
use warnings;
use utf8::all;
use open ':std', ':encoding(UTF-8)';

use Test::Differences;
use Test::Deep::NoTest qw(cmp_details deep_diag);
use Test::More tests => 2;
use JSON;

my $context = 1;
my $extracted_ref = {
a => '1',
b => '2',
c => '3',
d => '4',
};
my $reference_ref = {
a => '1',
b => '3',
c => '3',
d => '4',
};

my ($is_compare_ok, $stack) = cmp_details($extracted_ref,$reference_ref);
my $json_reference = JSON->new->canonical->encode($reference_ref);
my $json_extracted = JSON->new->canonical->encode($extracted_ref);

ok(1);
if ($is_compare_ok){
ok(1);
return 1;
}else{
ok(0);
eq_or_diff($reference_ref, $extracted_ref, "Error in '$0'", {context=>$context}); # <- I don't want to count this
return 0;
}

我希望在脚本末尾执行测试,这两个ok是在过程中完成的。但函数 eq_or_diff 向 TAP session 添加了一个新测试,因此脚本以 3 个测试的异常(exception)结束,因此 done_testing() 期望 2但得到3

这是一个最小的示例,但通常我有一个主脚本:

main.t

use Test::More tests => 2;
...
ok(some_function_in_other_file_or_library(), "name_of_the_test");
...

lib.pm

...
sub some_function_in_other_file_or_library{
...
eq_or_diff(...)
return $bool;
}
...

我提到这一点是因为我尝试使用 substest 并且我也无法使其工作,而且我主要不需要现在库中发生的事情,因为否则我认为我可以使用done_testing($planned_tests+1):

lib.pm

use Test::More tests qw/subtest/;
subtest 'An example subtest' => sub {
plan tests => 1;

eq_or_diff(...)
};

摘要:我怎样才能做出类似的东西:

do_not_add_to_tap(eq_or_diff(...))
# or
increased during runtime the planned tests
plan() = plan()+1...

最佳答案

Test::Differences 和 friend 们实际上为您做了两件事,然后通过将其与测试框架紧密耦合来使其复杂化。这并不是什么大麻烦,因为它实际上只是包装了您可以直接使用的其他模块中的内容。

首先,它使用 Data::Dumper 通过设置各种参数(例如 SortKeys)来输出可预测的序列化。其次,它使用 Text::Diff 来比较这些转储的行。

所以,你自己做吧。这是第一部分,它只返回表示转储的单个字符串,适合字符串比较以查看它们是否相等:

sub dump_it {
my( $arg ) = @_;
local $Data::Dumper::Deparse = 1;
local $Data::Dumper::Indent = 1;
local $Data::Dumper::Purity = 0;
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Deepcopy = 1;
local $Data::Dumper::Quotekeys = 0;
local $Data::Dumper::Useperl = 1;
local $Data::Dumper::Sortkeys = 1;
Data::Dumper::Dumper($arg);
}

第二部分使用 Text::Diff 执行类似的操作。它设置了各种参数,您可以根据口味进行调味。我这样做是为了向它传递两个字符串,我将其转换为数组引用内的行(因为这全部在内存中):

sub my_diff {
state $rc = require Text::Diff;
my( $got, $expected, $context ) = @_;

$context //= 3; # lines around the diff to show

my $diff = Text::Diff::diff
[ split /^/m, dump_it( $got ) ],
[ split /^/m, dump_it( $expected ) ],
{ CONTEXT => $context,
STYLE => 'Table',
FILENAME_A => 'got',
FILENAME_B => 'expected',
OFFSET_A => 1,
OFFSET_B => 1,
INDEX_LABEL => "Ln",
};
chomp $diff;
$diff .= "\n";

$diff;
}

现在你的程序的主要内容是这样的:

my $is_same = dump_it( $reference_ref ) eq dump_it( $extracted_ref );

pass();
if ($is_same){
pass();
}else{
fail();
note( my_diff( $reference_ref, $extracted_ref, 1 ) );
}

关于perl - 如何使用 Test::more 忽略 perl 中的 TAP 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67605755/

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