作者:陈婉恩上源 | 来源:互联网 | 2023-01-26 18:26
我能够test_case.t
为Perl模块编写单元测试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
?
1> simbabque..:
有两种选择。一种是使用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
s 使用参数。将所有子项放在中package
,然后在脚本中包含GetOpts,然后将选项作为参数传递给函数。
这样,您可以测试所有内容,并且实际上不需要脚本。