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

标签 perl unit-testing testcase test-more

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

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

最佳答案

有几个选项。一是使用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 的参数。将所有子项放入中,然后在脚本中使用 GetOpts,并将选项作为参数传递给函数。

这样您就可以测试所有内容,并且实际上不需要脚本。

关于perl - 如何为 Perl 脚本编写单元测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45493841/

相关文章:

Perl 管道日志脚本仅每 2 次点击运行一次

arrays - 将多个局部变量分配给 perl 中的数组条目

unit-testing - 软件测试中单词 "Correctness"的意义是什么?

php - 对需要发送 header 的项目进行单元测试

c# - NUnit 测试用例预期消息

mysql - 测试用例编写

mysql - 在进程中间从脚本中释放内存

perl - 如何在Perl中制作动画加载标志?

php - 使用 Laravel 5 [phpunit] 测试方法和 Controller

python 2.6 - django TestCase - assertRaises ValidationError clean() 方法