5

Perl スクリプトとモジュールのカバレッジ用にデータをマージする際に問題があります.Devel::Cover を個別に実行すると問題なく動作しますが、データを結合しようとすると、モジュールではなく Perl スクリプトだけの統計が失われます..

説明させてください..

次のようなディレクトリツリーがあります..

Code_Coverage_Test
 |
 |---->lib
 |
 |---->t
 |

ルート Code_Coverage_Test ディレクトリ内には、モジュールのテストをビルドする Build.pl ファイルと、いくつかのコマンドを自動化する他の 2 つのスクリプトを開始するスクリプトがあります。

./Build.pl

#!/usr/bin/perl -w

use strict;
use Module::Build;

my $buildTests = Module::Build->new(
        module_name             => 'testPMCoverage',
        license                 => 'perl',
        dist_abstract           => 'Perl .pm Test Code Coverage',
        dist_author             => 'me@myEmail.com',
        build_requires  => {
           'Test::More' => '0.10',
        },

);

$buildTests->create_build_script();

./startTests.sh

#!/bin/sh

cd t
./doPMtest.sh
./doPLtest.sh

cd ../

perl Build testcover

lib ディレクトリ内に、コード カバレッジを実行しようとしているファイルがあります。

lib/testPLCoverage.pl

#!/usr/bin/perl -w

use strict;

print "Ok!";

lib/testPMCoverage.pm

use strict;
use warnings;
package testPMCoverage;

sub hello {
    return "Hello";
}

sub bye {
    return "Bye";
}


1;

t ディレクトリには、モジュール用の .t テスト ファイルと、テストを開始する 2 つのスクリプトがあります。どちらもルート ディレクトリの startTests.sh によって呼び出されます。

t/testPMCoverage.t

#!/usr/bin/perl -w


use strict;
use Test::More;

require_ok( 'testPMCoverage' );

my $test = testPMCoverage::hello();
is($test, "Hello", "hello() test");

done_testing();

t/doPLtest.sh

#!/bin/sh

#Test 1
cd ../
cd lib
perl -MDevel::Cover=-db,../cover_db testPLCoverage.pl

t/doPMtest.sh

#!/bin/bash

cd ../
perl Build.pl
perl Build test

私が直面している問題は、doPLtests.sh スクリプトを実行すると、カバレッジ データが取得されることです。問題ありません..

---------------------------- ------ ------ ------ ------ ------ ------ ------
File                           STMT   Bran   Cond    Sub    pod   Time  total
---------------------------- ------ ------ ------ ------ ------ ------ ------
testPLCoverage.pl             100.0    n/a    n/a  100.0    n/a  100.0  100.0
Total                         100.0    n/a    n/a  100.0    n/a  100.0  100.0
---------------------------- ------ ------ ------ ------ ------ ------ ------

ただし、doPMtest.sh スクリプトが終了し、startTests.sh スクリプトが Build testcover コマンドを開始すると、途中でそのデータが失われ、これらのメッセージが表示されます ...

Reading database path/Code_Coverage_Tests/cover_db
Devel::Cover: Warning: can't open testPLCoverage.pl for MD5 digest: No such file or directory
Devel::Cover: Warning: can't locate structure for statement in testPLCoverage.pl
Devel::Cover: Warning: can't locate structure for subroutine in testPLCoverage.pl
Devel::Cover: Warning: can't locate structure for time in testPLCoverage.pl

..そしてどういうわけか私はデータを失います

---------------------------- ------ ------ ------ ------ ------ ------ ------
File                           STMT   Bran   Cond    Sub    pod   Time  total
---------------------------- ------ ------ ------ ------ ------ ------ ------
blib/lib/testPMCoverage.pm     87.5    n/a    n/a   75.0    0.0  100.0   71.4
testPLCoverage.pl               n/a    n/a    n/a    n/a    n/a    n/a    n/a
Total                          87.5    n/a    n/a   75.0    0.0  100.0   71.4
---------------------------- ------ ------ ------ ------ ------ ------ ------

Perl モジュールと Perl スクリプトのテストを組み合わせて、1 つのファイルで有効なコード カバレッジを得るにはどうすればよいですか?

4

1 に答える 1

5

Perl は、使用するファイルへのフル パスを保存しません。相対パスでファイルが見つかった場合は、相対パスのみが保存されます。これは、perl がこれらのファイルの警告およびエラー メッセージに表示するパスで確認できます。

Devel::Cover がファイルを扱うとき、perl によって与えられたパスを使用します。これは、testPLCoverage.pl と blib/lib/testPMCoverage.pm がある Devel::Cover からのレポートで確認できます。

これが実際に意味することは、カバレッジをカバレッジ DB に入れるときはいつでも、Devel::Cover がカバレッジ DB 内のファイルを一致させて見つけることができるように、同じディレクトリから実行していることを確認する必要があるということです。

これがあなたがぶつかっている問題だと思います。

私の提案は、t/doPLtest.sh で lib に cd しないことです。次のようなものを実行できます。

perl -Mblib -MDevel::Cover=-db,../cover_db lib/testPLCoverage.pl

(余談ですが、なぜそのファイルはlibにありますか?)

これは、Devel::Cover がそれぞれの場合にプロジェクト ルートから実行されることを意味するので、ファイルを照合して検索できるようにする必要があると思います。

于 2014-03-29T16:35:37.283 に答える