【问题标题】:OS specific tests for Perl test scripts针对 Perl 测试脚本的操作系统特定测试
【发布时间】:2009-10-26 11:18:01
【问题描述】:

是否有更优雅的方式来编写依赖于 O/S 的测试脚本部分?

请参考注释行下方的代码。

背景: 模块 Perl::Tags 为 VIM 创建一个标签文件。在 Win32 上,目录分隔符是“\”,但在其他操作系统上是“/”。 Vim 的 Perl-support 模块似乎读标签文件很愉快,所以似乎不需要修改模块。

#!/usr/bin/perl -w
use strict; use warnings;
use Data::Dumper;

use Test::More tests => 6;
use FindBin qw($Bin);

BEGIN {
  use_ok( 'Perl::Tags' );
}

my $naive_tagger = Perl::Tags::Naive->new( max_level=>1 );
ok (defined $naive_tagger, 'created Perl::Tags' );
isa_ok ($naive_tagger, 'Perl::Tags::Naive' );
isa_ok ($naive_tagger, 'Perl::Tags' );

my $result = 
    $naive_tagger->process(
        files => [ "$Bin/Test.pm" ],
        refresh=> 1
    );
ok ($result, 'processed successfully' ) or diag "RESULT $result";

# Other tests also fail because \Test.pm on Win32 vs /Test.pm on Linux/ OS X
if ( $^O =~ /MSWin32/ ) {
    like ($naive_tagger, qr{Test\t\S+\\Test.pm\t/package Test;/}       , 'package line');
} else {
    like ($naive_tagger, qr{Test\t\S+/Test.pm\t/package Test;/}       , 'package line');
}

【问题讨论】:

    标签: perl testing winapi perl-module


    【解决方案1】:

    File::SpecPath::Class 旨在解决这类平台特定问题。

    以下是你想要做的吗?

    #!/usr/bin/perl
    use strict; use warnings;
    
    use Test::More tests => 6;
    use FindBin qw($Bin);
    use File::Spec::Functions qw(catfile catpath rootdir);
    
    BEGIN {
      use_ok( 'Perl::Tags' );
    }
    
    my $naive_tagger = Perl::Tags::Naive->new(max_level => 1);
    ok (defined $naive_tagger, 'created Perl::Tags');
    isa_ok ($naive_tagger, 'Perl::Tags::Naive');
    isa_ok ($naive_tagger, 'Perl::Tags');
    
    my $result = 
        $naive_tagger->process(
            files => [ catfile($Bin, 'Test.pm') ],
            refresh => 1
        );
    ok ($result, 'processed successfully' ) or diag "RESULT $result";
    
    my $file = catfile(rootdir, 'Test.pm');
    # or $file = catpath('C:', rootdir(), 'Test.pm')
    # depending on what you mean.
    
    like($naive_tagger
        qr{Test\t\S+\Q$file\E\t/package Test;/}, 
        'package line',
    );
    

    【讨论】:

    • 感谢您指出 Path::Class。 file('', 'Test.pm') 的字符串化根据需要返回 \Test.pm 或 /Test.pm。不幸的是 qr{ } 需要 \\Test.pm。我将在下面发布临时解决方案以供您发表评论。
    • 这正是我想要做的,除了所有测试都在 Test.pm 上进行,因此不需要声明 my $file
    【解决方案2】:

    也许您可以简单地始终使用 Linux 风格的斜线,因为:

    在编写必须在 NT 和 UNIX 下运行的 Perl 脚本时,您必须注意许多重要问题。首先是路径名的问题。在 DOS、Windows NT 和 Windows 95 中,您使用反斜杠运算符指定路径名,而在 UNIX 中,您使用正斜杠运算符。 Win32 Perl 端口允许使用正斜杠或反斜杠。在路径名中使用正斜杠的 Perl 脚本比使用反斜杠的脚本更容易移植。除此之外,Perl 脚本必须在字符串中使用两次反斜杠来从 Perl 解释器中转义一个反斜杠实例。驱动器号不必更改。

    例如,可以使用以下任一方式设置以下路径名:

    $myFile = "E:/users/default/datafile.txt";
    
    $myFile = "E:\\users\\default\\datafile.txt";
    

    (来自Perl 5 Unleashed


    如果您确定不能始终使用 Linux 样式,可以尝试使用 CPAN 模块 File::SpecPath::Class。查看"CPAN Module for mixing Unix/Windows path" discussion on Perlmonks 了解更多信息。

    【讨论】:

    • 谢谢。请参考下面对思南的评论。
    • @Igor:不客气。删除了我的 cmets,因为它们不再相关。
    【解决方案3】:

    根据 Sinan Ünür 的指导进行了修订 -- 如果出现以下情况,则无需进行特定于操作系统的测试

    like ($naive_tagger, qr{Test\t\S\Test.pm\t/package Test;/}       , 'package line');
    

    替换为

    like ($naive_tagger, qr{Test\t\S+\QTest.pm\E\t/package Test;/}       , 'package line');
    

    \Q(禁用)模式元字符直到 \E

    \E再次禁用模式元字符

    【讨论】:

    • qr{Test\t\S+\Q$file\E\t/package Test;/} 没有必要为你所经历的所有障碍。
    • 太棒了。工作一种享受。非常感谢你。以前的尝试应该投反对票!
    • 注意,我的名字不用加粗。另外,我认为您在当前版本中犯了某种剪切粘贴错误。看看它,看看你说的是不是你的意思。
    • 加粗了对思南的归属并修复了剪切和粘贴错误
    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多