Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing PERL5LIB、@INC和测试库优先级_Unit Testing_Perl - Fatal编程技术网

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
    开始
  • 你开始“运行”你的程序,你开始编译阶段。它在执行运行时语句之前编译整个程序
  • 在编译时,它会遇到
    use lib
    ,并立即执行该pragma。现在
    /top/priority/use/lib/second\u priority
    位于
    @INC
    的开头
  • 对于编译阶段的其余部分,
    /top/priority/use/lib/second\u priority
    @INC
    中的第一件事。这就是后续的
    use
    调用查找内容的地方
  • 编译阶段结束,程序过渡到运行阶段
  • 它遇到
    推送
    ,并执行该操作。现在
    /push/inc/lower_priority
    @inc
    的最后一个元素
  • 它跳过
    use lib
    ,因为编译阶段处理pragma
  • 它遇到
    unshift
    并执行该命令。现在
    /unshift/inc/lib/first\u priority
    @inc
    中的第一项
  • 后续的
    require
    调用(运行时功能)将首先查看
    /unshift/inc/lib/first\u priority

我不知道您希望在哪里找到要加载的库,但您必须提供它的完整路径。lib/下可能有额外的目录,这很重要,您还没有考虑。

除非我没有其他选择,否则我不会硬编码路径

通常,您不希望硬编码可以以其他方式提供给您的程序的东西,以便它能够响应它所在的任何环境,而不仅仅是您开发它的环境。其中一个环境可以是您的测试环境

您可以从程序外部设置库搜索路径,这使它更加灵活

而且,由于您硬编码它们并在运行时添加它们,它们将在您之前设置的任何内容之后出现。以下是在您的环境中发生的情况:

  • 从默认的
    @INC
    开始
  • 你开始“运行”你的程序,你开始编译阶段。它在执行运行时语句之前编译整个程序
  • 在编译时,它会遇到
    use lib
    ,并立即执行该pragma。现在
    /top/priority/use/lib/second\u priority
    位于
    @INC
    的开头
  • 对于编译阶段的其余部分,
    /top/priority/use/lib/second\u priority
    @INC
    中的第一件事。这就是后续的
    use
    调用查找内容的地方
  • 编译阶段结束,程序过渡到运行阶段
  • 它遇到
    推送
    ,并执行该操作。现在
    /push/inc/lower_priority
    @inc
    的最后一个元素
  • 它跳过
    use lib
    ,因为编译阶段处理pragma
  • 它遇到
    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