- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想利用这个库来漂亮地打印我的测试的差异 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/
如果我的 Perl 程序使用 Perl 模块,它将如何确定在哪里可以找到包含模块代码的文件? 例如,如果程序包含: use MyModule1; # Example 1 us
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我在一个文件中有一些不同格式的数字:8.3、0.001、9e-18。我正在寻找一种简单的方法来读取它们并存储它们而不会损失任何精度。这在 AWK 中很容易,但在 Perl 中是如何完成的呢?我只愿意使
我正在自学 Perl,并且在我的 Windows 8 64 位系统上安装了 Strawberry。 Strawberry 命令行似乎工作正常,我在 C 驱动器上的 Strawberry 文件夹中创建了
我在 Perl 模块 IO::Socket::SSL 中发现了一个错误,我可能会修复它,但是,我担心测试修复。我从 Debian 下载了源码包(因为我打算为它制作一个 Debian 包或补丁)并查看了
我有一个 perl 文件,它使用了两个 perl 模块 A.pm 和 B.pm。 但是在 B.pm 中我需要调用 A.pm 的子程序。即使我在 A.pm 中使用并尝试使用它,我仍然遇到未定义的错误。
有没有办法在 Perl 运行时加载整个模块?我原以为我用 autouse 找到了一个很好的解决方案,但以下代码无法编译: package tryAutouse2; use autouse 'tryAu
过去,我编写过许多 perl 模块,以及不止一些独立的 perl 程序,但我之前从未发布过多文件 perl 程序。 我有一个几乎处于 beta 阶段的 perl 程序,它将被开源发布。它需要一些数据文
我有 1 个 perl 脚本,我们在其中编写了几个子例程。例子: # Try_1.pl main(); sub main{ --- --- check(); } check { -- --} 现在,
似乎 CPAN 上的一些(很多?)模块部分是使用 XS 在 C 中实现的,如果需要,可以回退到纯 perl 实现。虽然这很聪明,但它显然会损害性能,我想知道它是否会发生,以便我可以解决问题。 有没有一
我对 perl 很陌生。我希望我可以从 perl 安装一些软件包,我这样做是这样的: perl -MCPAN -e 'install VM::EC2' 我猜它由于依赖而失败,它显示: Result:
给定一个 Perl 包 Foo.pm,例如 package Foo; use strict; sub bar { # some code here } sub baz { # more
我有一个用 Perl 编写的测试生成器。它生成连接到模拟器的测试。这些测试本身是用 Perl 编写的,并通过其 API 连接到模拟器。我希望生成的代码是人类可读的,这意味着我希望它能够正确缩进和格式化
我正在学习 Perl,非常新的用户。我可以知道这些 Perl 代码之间有什么区别吗? #!/usr/bin/perl & #!/usr/bin/perl -w 最佳答案 那不是 perl 代码,它是
我不认为这是一个重复的问题。这专门针对 Perl 模块附带的脚本。 通常,在安装多个 Perl 版本时,您可以将 perl 可执行文件标记为版本号 (perl5.32),这样它们就可以在 /whate
我有一个在文件中使用 Blowfish 加密的程序和第二个 perl 程序,它提示输入用于将其解密为字符串的密码,我希望不必将解密的源代码写入硬盘驱动器,尽管将它放在内存中并不是真正的问题,因为运行程
有没有人为 Perl 中的惰性求值列表找到了一个好的解决方案?我尝试了很多方法来改变类似的东西 for my $item ( map { ... } @list ) { } 进入懒惰的评估——例如,通
我安装了多个版本的 Perl。 我已经指定了要使用的版本。但是为了验证,我想从 .pl 脚本本身输出 Perl 的版本。 这可能吗? 在 Perl 脚本中解析“perl --version”的输出似乎
人们还经常问“我怎样才能编译 Perl?”而他们真正想要的是创建一个可以在机器上运行的可执行文件,即使他们没有安装 Perl。 我知道有几种解决方案: perl2exe靛蓝之星 它是商业的。我从未尝试
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!