5

我能够test_case.t为 Perl 模块编写单元测试ModuleOne.pm

测试用例.t

use strict;
use warnings;
use Test::More;
use Test::Cmd;
use ModuleOne; # Included the module here

my $ret = ModuleOne::methodone(args);
is($ret->{val}, 1, "Checking return value"); # success 

我正在尝试为 perl 脚本实现相同的单元测试用例script_one.pl

script_one.pl

use strict;
use warnings;
use ModuleOne;

my $NAME;
my $ID;

# get parameters
GetOptions (
 "name" => \$NAME,
 "emp_id" => \$ID,
)

validate_params();

sub validate_params {
   # this method will validate params 
}

sub print_name {
   # this method will print name 
}

如何包含这个 perl 文件并script_one.pl为方法和test_case.t编写测试用例?validate_paramsprint_name

4

1 回答 1

7

有几个选项。一种是使用Test::Script来查看您的代码是否编译和运行,并执行一些操作。虽然它更像是一个集成测试而不是一个单元测试,如果你有像写入文件系统这样的外部依赖项,那么像这样模拟它们是很困难的。

由于您在脚本中有 subs,最简单的方法可能是测试文件requiredo的脚本,可能在不同的文件中package(但这并不重要)。然后您可以调用这些函数,因为它们位于您的命名空间之一中。

use strict;
use warnings;
use Test::More;

package Foo {
    do 'script_one.pl';
};

is Foo::print_name, 'foo', 'prints the right name';

这样,您可以更轻松地模拟依赖项并获得更多控制权。唯一可能棘手的是不在 subs 中的代码,将在调用时运行,例如调用validate_params. 您可以使用Capture::Tiny将其刷到地毯下。

最好的选择是在您的脚本中没有函数。只需制作另一个具有这些功能的模块,然后在您的脚本中调用它。有一个像下面这样的脚本很好。

#!/usr/bin/env perl
use strict;
use warnings;
use My::Modules::Foo;

My::Modules::Foo->run; # or ::run()

是否为 OOP 并不重要。这个想法将是相同的。如果您正确封装它,您可以对所有代码进行单元测试,而无需使用该脚本。

关于 GetOpts 的东西,这些变量可以是脚本的词法,但是您用大写字母命名并且validate_params调用缺少参数表明它们确实是包范围的并且在函数内部使用。不要那样做。使用subs 的参数。将所有 subs 放在 a 中package,然后在脚本中使用 GetOpts,并将选项作为参数传递给函数。

这样您就可以测试所有内容并且真的不需要脚本。

于 2017-08-03T20:43:11.543 回答