我能够为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_params
和print_name
编写测试用例?
答案 0 :(得分:4)
有几种选择。一种方法是使用Test::Script来查看代码是否编译并运行,并执行一些操作。它更像是一个集成测试,而不是单元测试,如果你有外部依赖,比如写入文件系统,很难像这样嘲笑那些。
由于您已经在脚本中使用了子,因此最简单的方法可能是require
或do
测试文件中的脚本,可能在不同的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,并将选项作为参数传递给函数。
这样你就可以测试一切,真的不需要脚本。