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



我可以为Perl模块编写单元测试test_case.tModuleOne.pm

test_case.吨

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编写测试用例?

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

由于脚本中有 sub,最简单的方法可能是在测试文件中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,并将选项作为参数传递给函数。

这样你就可以测试所有内容,真的不需要脚本。

相关内容

  • 没有找到相关文章