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