如何在perl中运行多个测试脚本并提供另一个脚本的参数?

问题描述

我一直在研究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);

这不会立即可用,因为我刚刚从项目中删除了一些行,但是对如何运行其他文件并获得结果以生成报告的想法有所了解,同时仍然能够运行每个项目都是单独的,并且能够将通用参数发送到主脚本中的不同测试。