问题描述
我一直在研究perl的一些模块,并且我已经看到在文件夹t
和扩展名.t
下进行大量测试是一种标准。
这些脚本可以直接用perl <test>.t
执行。
我想做一些测试一个应用程序的框架。我想进行许多简单的测试。然后是一个主脚本,该脚本调用此测试以一次验证所有内容,但仍能够单独运行这些小测试,而不必手动禁用主脚本中的其他测试。
我的问题是我应该如何打电话?如How do I run a Perl script from within a Perl script?中的建议,应避免这种进程间通信,而应使用模块,但这将无法直接运行测试。
我的猜测是要执行以下操作。在需要在硒脚本中提供一些参数的示例中 这是文件夹结构:
├── 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,"-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 $0\n";
这是正确的方法还是使用模块进行此操作更合适?
解决方法
作为标准Perl发行版的一部分,您已经具有“ 主脚本,该脚本调用该测试以一次验证所有内容,但仍能够单独运行这些小测试”。称为brew install ...
。
不带参数运行prove
将运行所有与prove
匹配的测试脚本(因此,当您运行t/*.t
时,您希望将测试放在t/
子目录中,而不是在同一目录中目录),也可以使用prove
运行单个测试脚本。
请注意,prove t/00-Test_1.t
期望测试脚本以TAP(“任何测试协议”)格式发出输出,这通常是通过在测试脚本中使用Test::More或其他Test :: *模块来实现的
如果遵循将特定于应用程序的模块放在prove
子目录中的约定,则运行lib/
会将它们添加到prove -l
中,以使它们在运行测试脚本时可用。即
@INC
,
尽管@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 $0\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',"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);
这不会立即可用,因为我刚刚从项目中删除了一些行,但是对如何运行其他文件并获得结果以生成报告的想法有所了解,同时仍然能够运行每个项目都是单独的,并且能够将通用参数发送到主脚本中的不同测试。