gpt4 book ai didi

Perl 测试 - 测试的公共(public)父级

转载 作者:行者123 更新时间:2023-11-28 20:19:35 25 4
gpt4 key购买 nike

我有一组测试,总是命名为 Module.t,每个测试都是这样开始的:

use 5.026;
use strict;
use warnings;

use Test::Perl::Critic (-severity => 3);
use Module::Path 'module_path';
use Test::More tests => 8;
use Test::Log4perl;
Test::Log4perl->suppress_logging;

BEGIN { use_ok("My::Module") }
critic_ok(module_path("My::Module"));

... actual tests for this module ...

这样做是因为一堆模块没有很好地编码,并且为了在我们进行的过程中重构东西,我正在尝试随着时间的推移为单个模块编写测试。例如。我不能只为所有来源启用 Perl::Critic,因为它会在我面前爆炸。

理想情况下,我想为所有这些做一个“父”测试,这样当我或其他开发人员想要编写一个新测试时,他们将始终拥有所有必需的东西。像这样的东西:

use 5.026;
use strict;
use warnings;

# 6 tests because 2 (use_ok and critic_ok) are already in the parent
use parent ParentTest("My::Module", tests => 6);

... actual tests for this module ...

perl 有办法做到这一点吗?

免责声明:我是 perl 菜鸟,所以也许这有更好的解决方案 :-)

最佳答案

听起来您只需要一个辅助模块来加载一些其他模块并为您运行一些初始测试。

类似于:

# ParentTest.pm
package ParentTest;
use strict;
use warnings;

use Test::Perl::Critic (-severity => 3);
use Module::Path 'module_path';
use Test::More;
use Test::Log4perl;

sub import {
my (undef, $module, %args) = @_;

$args{tests} += 2;

plan %args;
Test::Log4perl->suppress_logging;
use_ok $module;
critic_ok module_path $module;

@_ = 'Test::More';
goto +Test::More->can('import');
}

1

用法是:

use ParentTest "My::Module", tests => 6;

这一切都未经测试,但想法是:

  • 我们想运行一些代码来设置初始测试计划并运行一些测试。
  • 我们还想导出 Test::More 导出的所有内容,因此我们的调用者不必自己使用 Test::More
  • use Some::Module @args 等同于 BEGIN { require "Some/Module.pm";一些::模块->导入(@args); },所以我们可以将自定义逻辑放在 import 方法中。
  • 我们首先忽略第一个参数(这是一个类名,因为 import 被称为类方法)并将剩余的参数分配给 $module%args.
  • 我们将 $args{tests} 增加 2 以说明我们自动执行的两个额外测试(如果未传入 tests,则会在此处隐式创建).
  • 我们将 %args 传递给 plan from Test::More ,这非常适合在初始 use 行之外设置测试计划。
  • 我们执行初始测试。
  • 我们尾调用 Test::More::import,删除我们自己的栈帧。这使得它看起来像我们的调用者执行了 Test::More->import(),它将所有 Test::More 实用程序函数导出给它们。
  • goto +Test::More->... 中的一元 + 没有实际作用,但它有助于区分 goto LABELgoto EXPRESSION 句法形式。我们想要后一种解释。

关于Perl 测试 - 测试的公共(public)父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53235746/

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