Как написать тестовые примеры для сценария Perl
Я могу написать модульные тесты 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
}
Как я могу включить этот файл Perl script_one.pl
в test_case.t
и написать контрольные примеры для методов validate_params
а также print_name
?
1 ответ
Есть несколько вариантов. Одним из них является использование 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';
Таким образом, вы можете легко смоделировать зависимости и получить больше контроля. Единственное, что может быть хитрым, это код, который не находится в подпрограммах и будет запускаться при вызове, например при вызове validate_params
, Вы можете просто использовать Capture:: Tiny, чтобы почистить это под ковриком.
Однако лучше всего не иметь функций в вашем скрипте. Просто создайте другой модуль, который имеет эти функции, и вызовите его в своем скрипте. Хорошо иметь скрипт, подобный следующему.
#!/usr/bin/env perl
use strict;
use warnings;
use My::Modules::Foo;
My::Modules::Foo->run; # or ::run()
Неважно, ООП или нет. Идея будет такой же. Если вы инкапсулируете его правильно, вы можете протестировать весь код без использования этого скрипта.
Что касается вещей GetOpts, эти переменные могут быть лексическими для сценария, но ваши имена с заглавными буквами и отсутствие аргументов для validate_params
Вызов указывает, что они действительно для всего пакета и используются внутри функции. Не делай этого. Используйте аргументы для sub
s. Поместите все подводные лодки в package
, затем включите GetOpts в сценарий и передайте параметры в качестве аргументов функции.
Таким образом, вы можете проверить все и на самом деле не нужен сценарий.