使用 Test2 编写新的测试工具

Perl 很早就拥有优秀的测试工具,但 Test2 是近年来对 Perl 测试功能的最重大改进。我最喜欢的 Test2 功能之一是扩展它的新工具非常简单,今天我将向您展示我是如何编写我的第一个工具的。
处理已知的测试失败
理想情况下,当您的测试失败时,意味着需要修复某些内容,而且这个问题是可以修复的。然而,在现实世界中,事情并不总是那么简单。例如,您可能调查了一个失败,找到了根本原因,但修复它的人正在度假。或者,也许代码中有一个日期时间错误,几天后会自行解决。关键是,这个失败是可以理解的,不是很严重,但短期内难以修复。
几个月前,我遇到了 exactly 这种情况。我不想跳过失败的测试,因为它可能被遗忘,但我又想在同时完成构建。在大型分布式开发团队中,您希望成功的构建成为“常态”,因此当构建失败时,开发者会注意到。
我决定我需要的是一个 skip_until
函数,它可以跳过测试,直到达到一个日期,然后它将再次开始失败。由于在 CPAN 上找不到任何东西,我觉得是时候开发一个新的测试工具了。
Test2 术语:插件与工具
在 Test2 中,“插件”是一个覆盖现有 Test2 功能行为的包,而“工具”是一个提供新函数的包。在这种情况下,我正在创建一个全新的测试函数,因此我需要编写一个 Test2::Tools。
Test2::API 上下文
Test2::API 提供了 context
函数,以便在运行时访问测试上下文。上下文对象提供了常见的测试方法,如 pass
、fail
和 skip
等,这允许您添加自定义测试行为。以下是我如何使用它来跳过测试的示例。
package Test2::Tools::SkipUntil;
use Test2::API 'context';
use Exporter 'import';
our @EXPORT_OK = ('skip_until');
sub skip_until {
my ($reason, $count, $date) = @_;
...
if ($should_skip) {
my $ctx = context();
$ctx->skip('skipped test', "$reason skip until $date") for (1..$count);
$ctx->release;
no warnings 'exiting';
last SKIP;
}
}
1;
我声明了一个名为 skip_until
的新函数,它接受一个跳过原因文本、要跳过的测试数量和一个日期。这个签名与 skip 相同,但多了一个日期参数(我不太喜欢参数的顺序,但我认为最好是保留与现有先例的相似性)。
为了简洁,我省略了参数检查代码和日期时间逻辑,以确定 $should_skip
是否为真。如果是,主 if
块会获取测试上下文,并调用 skip
以跳过要跳过的测试数量。接下来,它调用 release
以释放测试上下文(重要!)。最后,它调用 last
以退出从 skip_until
调用的 SKIP 块。
仔细的读者可能会注意到,使用 SKIP
意味着 $count
可以是 1,并且跳过块内的所有测试都将被跳过。这与 Test2 的行为相同,事实上,那段代码几乎与 Test2::Tools::Basic 的 源代码 相同。
使用新工具
现在,如果我在测试中导入 Test2::Tools::SkipUntil
,我就可以像使用任何其他模块一样使用它。
#!/usr/bin/perl
use Test2::Tools::Basic;
use Test2::Tools::SkipUntil 'skip_until';
SKIP:{
skip_until 'This should be fixed next month, see ticket #529', 1, '2018-06-30';
ok foo();
...
}
done_testing;
测试将一直跳过,直到达到指定日期。Test2 使得编写新的测试工具变得容易,如果您有一个新的测试函数的好主意,请考虑使用 Test2。
参考
- Test2::Tools 是 Test2 工具的 Test2 文档。
- 有关插件的信息,请参阅 Test2::Plugin。
- Test2::API 用于获取测试上下文对象,请参阅上下文 规则
- Test2::Tools::SkipUntil
封面图片来自 pixabay。
标签
反馈
这篇文章有什么问题吗?请通过在 GitHub 上打开一个问题或拉取请求来帮助我们。