Unit testing PERL5LIB、@INC和测试库优先级
当Unit testing PERL5LIB、@INC和测试库优先级,unit-testing,perl,Unit Testing,Perl,当.pl或.pm具有使用lib或unshift@INC时,在测试perl代码时重写perl lib时遇到了一些困难,我的问题是: 在生产代码中使用use lib或unshift@INC是不是一个坏主意,因为它们很难测试?prove-lvr也不能覆盖这些 代码test.pl push @INC, '/push/inc/lowest_priority'; use lib "/top/priority/use/lib/second_priority"; unshift @INC, "/unshift/
.pl
或.pm
具有使用lib
或unshift@INC
时,在测试perl代码时重写perl lib时遇到了一些困难,我的问题是:
在生产代码中使用use lib
或unshift@INC
是不是一个坏主意,因为它们很难测试?prove-lvr
也不能覆盖这些
代码test.pl
push @INC, '/push/inc/lowest_priority';
use lib "/top/priority/use/lib/second_priority";
unshift @INC, "/unshift/inc/lib/first_priority";
foreach my $inc (@INC){
print "INC=>$inc\n";
}
INC=>/unshift/inc/lib/first_priority
INC=>/top/priority/use/lib/second_priority
INC=>/cmd/Iinclude/lib/
INC=>/export/PERL5LIB/env/lib
INC=>/usr/local/lib64/perl5
INC=>/usr/local/share/perl5
INC=>/usr/lib64/perl5/vendor_perl
INC=>/usr/share/perl5/vendor_perl
INC=>/usr/lib64/perl5
INC=>/usr/share/perl5
INC=>/push/inc/lowest_priority
设置perl环境
export PERL5LIB=/export/PERL5LIB/env/lib:$PERL5LIB
perl-I/cmd/Iinclude/lib/test.pl的输出
push @INC, '/push/inc/lowest_priority';
use lib "/top/priority/use/lib/second_priority";
unshift @INC, "/unshift/inc/lib/first_priority";
foreach my $inc (@INC){
print "INC=>$inc\n";
}
INC=>/unshift/inc/lib/first_priority
INC=>/top/priority/use/lib/second_priority
INC=>/cmd/Iinclude/lib/
INC=>/export/PERL5LIB/env/lib
INC=>/usr/local/lib64/perl5
INC=>/usr/local/share/perl5
INC=>/usr/lib64/perl5/vendor_perl
INC=>/usr/share/perl5/vendor_perl
INC=>/usr/lib64/perl5
INC=>/usr/share/perl5
INC=>/push/inc/lowest_priority
我可能误解了您的问题,但允许您“手动”调整模块路径。您应该能够使用它来控制测试环境使用的路径。我可能误解了您的问题,但允许您“手动”调整模块路径。您应该能够使用它来控制测试环境使用的路径。除非没有其他选项,否则我不会硬编码路径 通常,您不希望硬编码可以以其他方式提供给您的程序的东西,以便它能够响应它所在的任何环境,而不仅仅是您开发它的环境。其中一个环境可以是您的测试环境 您可以从程序外部设置库搜索路径,这使它更加灵活 而且,由于您硬编码它们并在运行时添加它们,它们将在您之前设置的任何内容之后出现。以下是在您的环境中发生的情况:
- 从默认的
开始@INC
- 你开始“运行”你的程序,你开始编译阶段。它在执行运行时语句之前编译整个程序
- 在编译时,它会遇到
,并立即执行该pragma。现在use lib
位于/top/priority/use/lib/second\u priority
的开头@INC
- 对于编译阶段的其余部分,
是/top/priority/use/lib/second\u priority
中的第一件事。这就是后续的@INC
调用查找内容的地方use
- 编译阶段结束,程序过渡到运行阶段
- 它遇到
,并执行该操作。现在推送
是/push/inc/lower_priority
的最后一个元素@inc
- 它跳过
,因为编译阶段处理pragmause lib
- 它遇到
并执行该命令。现在unshift
是/unshift/inc/lib/first\u priority
中的第一项@inc
- 后续的
调用(运行时功能)将首先查看require
/unshift/inc/lib/first\u priority
我不知道您希望在哪里找到要加载的库,但您必须提供它的完整路径。lib/下可能有额外的目录,这很重要,您还没有考虑。除非我没有其他选择,否则我不会硬编码路径 通常,您不希望硬编码可以以其他方式提供给您的程序的东西,以便它能够响应它所在的任何环境,而不仅仅是您开发它的环境。其中一个环境可以是您的测试环境 您可以从程序外部设置库搜索路径,这使它更加灵活 而且,由于您硬编码它们并在运行时添加它们,它们将在您之前设置的任何内容之后出现。以下是在您的环境中发生的情况:
- 从默认的
开始@INC
- 你开始“运行”你的程序,你开始编译阶段。它在执行运行时语句之前编译整个程序
- 在编译时,它会遇到
,并立即执行该pragma。现在use lib
位于/top/priority/use/lib/second\u priority
的开头@INC
- 对于编译阶段的其余部分,
是/top/priority/use/lib/second\u priority
中的第一件事。这就是后续的@INC
调用查找内容的地方use
- 编译阶段结束,程序过渡到运行阶段
- 它遇到
,并执行该操作。现在推送
是/push/inc/lower_priority
的最后一个元素@inc
- 它跳过
,因为编译阶段处理pragmause lib
- 它遇到
并执行该命令。现在unshift
是/unshift/inc/lib/first\u priority
中的第一项@inc
- 后续的
调用(运行时功能)将首先查看require
/unshift/inc/lib/first\u priority
我不知道您希望在哪里找到要加载的库,但您必须提供它的完整路径。lib/下可能有额外的目录,这很重要,您还没有解释。我不知道您遇到了什么麻烦,但是
@INC
的一个不明显的特点是运行时更改为@INC
,使用推送和取消推送(编译时)使用模块…
语句。还请注意,不使用lib.pm、PERL5LIB或-I
选项而添加到@INC
中的内容将不包括相关的特定于arch或版本的目录,因此,您应该始终使用这些方法中的一种来添加包含从CPAN安装的模块的库目录。我不知道您遇到了什么问题,但@INC
的一个不明显的特性是,使用推送和取消移位将运行时更改为@INC
(编译时)使用模块…
语句。另外请注意,不使用lib.pm、PERL5LIB或-I
选项而添加到@INC
中的内容将不包括相关的arch或versio