【问题标题】:How can I run multiple tests scripts in perl giving parameters from another one?如何在 perl 中运行多个测试脚本,并从另一个脚本中提供参数?
【发布时间】:2021-01-10 17:43:19
【问题描述】:

我正在查看一些 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 $0\n";

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

【问题讨论】:

  • 您已经拥有prove 实用程序来一次运行多个测试。如果你想控制他们的行为,你可能想看看现有的框架之一,如 Test::Class 或 Test::Class::Moose 来编写你的测试。如果你想运送到 CPAN,它会拉进来额外的依赖项,但对于专有的东西来说它很棒。
  • @simbabque 我一直在看它。但我认为通过使用您无法从主脚本中获取结果,例如从中制作报告。

标签: perl automated-tests ipc


【解决方案1】:

作为标准 Perl 发行版的一部分,您已经拥有“一个调用此测试来一次验证所有内容的主脚本,但仍然能够单独运行小测试”。它叫做prove

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

请注意,prove 期望测试脚本以 TAP(“测试任何协议”)格式发出输出,这通常通过在测试脚本中使用 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

【讨论】:

  • 但这是否允许对测试结果进行后处理?例如,如果我想在给定结果的主脚本中生成个性化报告。
  • @nck 你是什么意思?您可以使用各种可与prove 配合使用的 Tap::Harness:: 模块,也可以自己制作。例如,metacpan.org/pod/TAP::Harness::JUnit。您将看到prove 和用 Perl 编写的测试在许多主程序不是用 Perl 编写的开源软件中得到了广泛应用。很好的例子是用 C 语言编写的 Linux 核心实用程序,它们都在 Perl 中进行了测试。
  • @nck 始终可以在您专门为处理其输出和生成报告而编写的脚本之外运行prove。 (或者您拥有的任何其他“主”程序。)确保浏览相关组件的文档以及prove 本身的文档,以获取无数选项。
【解决方案2】:

虽然@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', "$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);

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

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2016-09-05
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多