如何在perl中运行多个测试脚本,从另一个脚本中给出参数



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

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

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

我的问题是我该如何打电话?如"如何在Perl脚本中运行Perl脚本?"中所建议的那样?应该避免这种进程间通信,而是使用模块,但这样就不可能直接运行测试。

我的猜测是做如下的事情。在一个示例中,我需要在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 $0n";

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

您已经有了">一个主脚本,它调用这个测试来一次验证所有内容,但仍然能够单独运行小测试";作为标准Perl发行版的一部分。它被称为prove

运行不带参数的prove将运行与t/*.t匹配的所有测试脚本(因此,当运行prove时,您希望测试在t/子目录中,而不是在同一目录中(,或者您可以使用prove t/00-Test_1.t运行单个测试脚本。

注意,prove期望测试脚本以TAP("test Anything Protocol"(格式发出输出,这通常是通过在测试脚本中使用test::More或其他test::*模块来实现的。

如果您遵循将特定于应用程序的模块放在lib/子目录中的惯例,那么运行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的回答足够好,但我将在@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 $0n";
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);

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

相关内容

最新更新