PerlテストスクリプトのOS固有のテスト
-
06-07-2019 - |
質問
テストスクリプトのO / Sに依存する部分を記述するよりエレガントな方法はありますか?
コメント行の下のコードを参照してください。
背景:モジュール Perl :: Tags は、VIMのタグファイルを作成します。 Win32では、ディレクトリ区切り記号は" \"です。しかし、他のOSでは" /"です。 VimのPerlサポートモジュールはタグファイルを非常に喜んで読み取るため、モジュールを変更する必要はないようです。
#!/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');
}
解決
File :: Spec および Path :: 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',
);
他のヒント
たぶん、いつでもLinuxスタイルのスラッシュを使用できます。理由は次のとおりです。
NTおよびUNIXで実行する必要のあるPerlスクリプトを記述する際に注意する必要がある多くの重要な問題があります。まず第一に、パス名の問題があります。 DOS、Windows NT、およびWindows 95では、バックスラッシュ演算子を使用してパス名を指定しますが、UNIXではスラッシュ演算子を使用します。 Win32 Perlポートでは、スラッシュまたはバックスラッシュを使用できます。パス名にスラッシュを使用するPerlスクリプトは、バックスラッシュを使用するスクリプトよりも移植性が高い可能性があります。それに加えて、Perlスクリプトは、Perlインタープリターからバックスラッシュの1つのインスタンスをエスケープするために、文字列でバックスラッシュを2回使用する必要があります。ドライブ文字を変更する必要はありません。
たとえば、次のいずれかを使用して次のパス名を設定できます。
$myFile = "E:/users/default/datafile.txt"; $myFile = "E:\\users\\default\\datafile.txt";
( Perl 5 Unleashed から)
常にLinuxスタイルを使用できるとは限らない場合は、CPANモジュール File :: Spec または Path :: Class 。 " Unix / Windowsパスを混在させるためのCPANモジュール"を確認します。追加情報については、Perlmonksに関する議論を参照してください。
SinanÜ nü rのガイダンスに従って改訂-OS固有のテストを行う必要はありません
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 パターンメタキャラクターを再度無効にする