如何为Perl脚本编写单元测试用例

时间:2017-08-03 20:19:29

标签: perl unit-testing testcase test-more

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

test_case.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 
}

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

1 个答案:

答案 0 :(得分:4)

有几种选择。一种方法是使用Test::Script来查看代码是否编译并运行,并执行一些操作。它更像是一个集成测试,而不是单元测试,如果你有外部依赖,比如写入文件系统,很难像这样嘲笑那些。

由于您已经在脚本中使用了子,因此最简单的方法可能是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调用的参数表明它们实际上是包的,并且在内部使用功能。不要那样做。使用sub的参数。将所有子函数放在package中,然后在脚本中包含GetOpts,并将选项作为参数传递给函数。

这样你就可以测试一切,真的不需要脚本。

相关问题