我如何 运行 perl 中的多个测试脚本给出另一个参数?

How can I run multiple tests scripts in perl giving parameters from another one?

我正在查看一些 perl 模块,我发现在扩展名为 .t 的文件夹 t 下进行大量测试是一种标准。

这些脚本可以直接用perl <test>.t执行。

我想做一个小框架来测试一个应用程序。我想进行许多简单的测试。然后是调用此测试的主脚本来一次验证所有内容,但仍然能够 运行 单独进行小测试,而无需手动禁用主脚本中的其他测试。

我的问题是我应该如何打电话?正如 How do I run a Perl script from within a Perl script? 中所建议的那样,应该避免这种进程间通信,而是使用模块,但这将无法直接 运行 测试。

我的猜测是做如下事情。在我需要在 selenium 脚本中提供一些参数的示例中 这是文件夹结构:

├── main_script.pl
└── t
    ├── 00-Test_1.t
    ├── 01-Test_2.t
    ├── 02-Test_3.t
    └── 03-Test_4.t

我会这样称呼他们:

system($^X, "./t/00-Test_1.t", "-b $browser", "-s $server", "-d $debug");
my $results = capture($^X, "./t/00-Test_1.t", "-b $browser", "-s $server", "-d $debug";
$log->info("Result is $results");

每个测试都会有这样的东西:

my ($browser, $server, $debug);
GetOptions(
    'debug|d'                   => $debug,
    'debug|d'                   => $trace,
    'trace|t'                   => $browser,
    'server|s=s'                => $server,
) or die "[ERROR] Invalid options passed to [=13=]\n";

这是正确的方法还是有更适合使用模块的方法?

作为标准的 Perl 发行版。它叫做 prove.

没有参数的

运行 prove 将 运行 所有匹配 t/*.t 的测试脚本(因此当您 运行 prove,不在同一个目录下),也可以用prove t/00-Test_1.t到运行单个测试脚本。

请注意,prove 期望测试脚本以 TAP(“测试任何协议”)格式发出输出,这通常通过使用 Test::More 或其他 Test::* 模块来完成测试脚本。

如果您按照惯例将 application-specific 模块放在 lib/ 子目录中,那么 运行ning prove -l 会将它们添加到 @INC 中在 运行 测试脚本时使它们可用。即,

Root directory (run `prove` from here)
├── lib
|   └── MyProject
|       └── MyModule.pm
└── t
    ├── 00-Test_1.t
    ├── 01-Test_2.t
    ├── 02-Test_3.t
    └── 03-Test_4.t

虽然@Dave Sherhman 的回答已经足够好了,但我会 post 我是如何让它在我的项目中发挥作用的,以及 @simbabque 的建议。因为我花了一段时间才了解它是如何工作的,也许它可以帮助另一个人节省一些时间:

我的*.t脚本现在是下面的脚本。我在哪里指定其中的测试数量,我还可以提供一些输入参数:

use strict;
use warnings;

use Test::More tests => 2;

use Getopt::Long qw(GetOptions);
use Drivers::Driver;
use Data::Dumper;

my ($browser, $server, $debug, $trace, $user, $password);
GetOptions(
    'debug|d'                   => $debug,
    'trace|t'                   => $trace,
    'user|u:s'                  => $user,
    'password|p:s'              => $password,
    'browser|b=s'               => $browser,
    'server|s=s'                => $server,
) or die "[ERROR] Invalid options passed to [=10=]\n";

ok(do_some_test($browser) == 1);
ok(do_another_test($user, $password) == 1);

done_testing;

然后我的主脚本调用我想要的脚本如下:

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

use TAP::Harness;
use TAP::Formatter::HTML;

my $fmt = TAP::Formatter::HTML->new();
$fmt->output_file( 'foo.html' );

my $test_args = {
  '00_test'    => ['--server', "$server", $debug?'-d':undef, $trace?'-t':undef, '--browser', "firefox"],
  '01_test'    => ['--server', "$server", $debug?'-d':undef, $trace?'-t':undef, '--browser', "chrome"],
};
my $test_output;
my $harness = TAP::Harness->new( {
        test_args => $test_args,
        formatter => $fmt,
        merge => 1
    } );
    
my $result = $harness->runtests( 
    [ 't/00-test.t',    '00_test' ],
    [ 't/01-test.t',    '01_test' ],
);


print "Passed: ". scalar $result->passed . "\n";
print "Failed: ". scalar $result->failed . "\n";

generate_report($result);

这不会开箱即用,因为我只是从我的项目中删除了一些行,但给出了它如何能够 运行 其他文件并获得结果以生成报告的想法,同时仍然能够 运行 每个项目单独进行,并且还能够从主脚本向不同的测试发送通用参数。