2017-08-03 73 views
2

我能够编写单元测试test_case.t为Perl模块ModuleOne.pm如何编写单元测试用例Perl脚本

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 
} 

我怎么能包括test_case.t本perl的文件script_one.pl和编写测试用例的方法validate_paramsprint_name

回答

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 s。将所有子集放在package中,然后在脚本中包含GetOpts,并将这些选项作为参数传递给函数。

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