内容

名称

TAP::Harness - 使用统计信息运行测试脚本

版本

版本 3.44

描述

这是一个简单的测试工具,它允许运行测试并自动汇总结果并输出到 STDOUT。

概要

use TAP::Harness;
my $harness = TAP::Harness->new( \%args );
$harness->runtests(@tests);

方法

类方法

new

my %args = (
   verbosity => 1,
   lib     => [ 'lib', 'blib/lib', 'blib/arch' ],
)
my $harness = TAP::Harness->new( \%args );

构造函数返回一个新的 TAP::Harness 对象。它接受一个可选的哈希引用,其允许的键为

任何值为 undef 的键将被忽略。

实例方法

runtests

$harness->runtests(@tests);

接受要运行的 @tests 数组。这通常应该是测试文件的名称,但这不是必需的。@tests 中的每个元素将作为 source 传递给 TAP::Parser::new()。有关更多信息,请参阅 TAP::Parser

可以通过将测试提供为包含 [ $test, $alias ] 的数组的引用来提供别名,这些别名将在测试名称的位置显示。

$harness->runtests( [ 't/foo.t', 'Foo Once' ],
                    [ 't/foo.t', 'Foo Twice' ] );

通常,尝试两次运行相同的测试是错误的。别名允许您通过为每次测试运行提供唯一的名称来克服此限制。

测试将按找到的顺序运行。

如果环境变量 PERL_TEST_HARNESS_DUMP_TAP 已定义,它应该命名一个目录,将每个测试的原始 TAP 复制到该目录中。TAP 写入以每个测试命名的文件。子目录将根据需要创建。

返回包含测试结果的 TAP::Parser::Aggregator

summary

$harness->summary( $aggregator );

输出 TAP::Parser::Aggregator 的摘要。

aggregate_tests

$harness->aggregate_tests( $aggregate, @tests );

运行命名测试并显示结果摘要。测试将按找到的顺序运行。

测试结果将添加到提供的 TAP::Parser::Aggregator 中。aggregate_tests 可以调用多次以运行多组测试。多个 Test::Harness 实例可用于将结果传递给单个聚合器,以便使用不同的 TAP::Harness 设置运行复杂测试套件的不同部分。例如,在某些测试应该并行运行而其他测试不适合并行执行的情况下,这很有用。

my $formatter   = TAP::Formatter::Console->new;
my $ser_harness = TAP::Harness->new( { formatter => $formatter } );
my $par_harness = TAP::Harness->new(
    {   formatter => $formatter,
        jobs      => 9
    }
);
my $aggregator = TAP::Parser::Aggregator->new;

$aggregator->start();
$ser_harness->aggregate_tests( $aggregator, @ser_tests );
$par_harness->aggregate_tests( $aggregator, @par_tests );
$aggregator->stop();
$formatter->summary($aggregator);

请注意,对于更简单的测试要求,通常可以使用对 runtests 的单个调用来替换上面的代码。

@tests 数组的每个元素都是

对于 Perl 测试套件,通常情况下,源名称 仅仅是需要运行的测试脚本的文件名。

当您提供一个单独的显示名称时,就可以多次运行同一个测试;显示名称实际上是测试在测试框架内部的别名。测试框架并不关心是否多次运行同一个测试,只要每次调用使用不同的名称。

make_scheduler

当测试框架需要创建一个 TAP::Parser::Scheduler 时,会调用此方法。在子类中重写此方法以提供备用调度器。make_scheduler 会将传递给 aggregate_tests 的测试列表作为参数。

jobs

获取或设置测试框架正在处理的并发测试运行次数。默认情况下,此值为 1 - 对于并行测试,应将其设置为更高的值。

make_parser

创建一个新的解析器和显示格式化程序会话。通常在子类中使用和/或重写。

my ( $parser, $session ) = $harness->make_parser;

finish_parser

终止解析器的使用。通常在子类中使用和/或重写。解析器不会因此而被销毁。

配置

TAP::Harness 被设计为易于配置。

插件

TAP::Parser 插件允许您更改 TAP 的输入输出 到解析器的方式。

TAP::Parser::SourceHandler 处理 TAP 的输入。您可以使用 "new"sources 参数来配置它们并加载自定义处理程序。

TAP::Formatter 处理 TAP 的输出。您可以使用 "new"formatter_class 参数来加载自定义格式化程序。要配置格式化程序,您目前需要在 TAP::Harness 之外实例化它,并使用 "new"formatter 参数将其传递进来。这可能 会通过在将来向 "new" 添加一个formatters 参数来解决。

Module::Build

Module::Build 版本 0.30 支持 TAP::Harness

要加载 TAP::Harness 插件,您需要使用 tap_harness_args 参数传递给 new,通常是在您的 Build.PL 中。例如

Module::Build->new(
    module_name        => 'MyApp',
    test_file_exts     => [qw(.t .tap .txt)],
    use_tap_harness    => 1,
    tap_harness_args   => {
        sources => {
            MyCustom => {},
            File => {
                extensions => ['.tap', '.txt'],
            },
        },
        formatter_class => 'TAP::Formatter::HTML',
    },
    build_requires     => {
        'Module::Build' => '0.30',
        'TAP::Harness'  => '3.18',
    },
)->create_build_script;

参见 "new"

ExtUtils::MakeMaker

ExtUtils::MakeMaker 不支持 TAP::Harness 开箱即用。

prove

prove 支持 TAP::Harness 插件,并拥有自己的插件系统。有关更多详细信息,请参见 "prove 中的 FORMATTERS""prove 中的 SOURCE HANDLERS"App::Prove

编写插件

如果您无法配置 TAP::Harness 来执行您想要的操作,并且找不到现有的插件,请考虑编写一个插件。

TAP::Harness 支持的两种主要插件用例是 输入输出

自定义 TAP 如何进入解析器

为此,您可以扩展现有的 TAP::Parser::SourceHandler,或编写自己的解析器。这是一个非常简单的 API,可以使用 sources 参数加载和配置它们,以指向 "new"

自定义 TAP 结果如何从解析器输出

为此,您可以扩展现有的 TAP::Formatter,或编写自己的格式化程序。编写格式化程序比编写 SourceHandler 稍微复杂一些,因为您需要了解 TAP::Parser API。一个好的起点是了解 "aggregate_tests" 的工作原理。

可以使用 formatter_class 参数加载和配置自定义格式化程序,以指向 "new"

子类化

如果您无法配置 TAP::Harness 来执行您想要的确切操作,并且编写插件不是一种选择,请考虑扩展它。它被设计为(大部分)易于子类化,尽管子类化必要的案例应该很少见。

方法

如果您想子类化TAP::Harness,以下方法是您可能希望覆盖的方法。

"new"
"runtests"
"summary"

REPLACING

如果您喜欢prove实用程序和TAP::Parser,但您想要自己的测试运行器,您只需要编写一个测试运行器并提供newruntests方法。然后,您可以像这样使用prove实用程序

prove --harness My::Test::Harness

请注意,虽然prove接受测试列表(或要测试的内容),但new具有相当丰富的参数集。您可能需要仔细阅读此代码以了解所有参数的使用方式。

SEE ALSO

Test::Harness