Devel::Cover объединяет данные покрытия для скриптов и модулей Perl

У меня проблемы со слиянием данных для покрытия скриптов и модулей Perl. Запуск Devel::Cover по отдельности работает просто отлично, но когда я пытаюсь объединить данные, я теряю статистику только для скрипта Perl, а не для модуля..

Позволь мне объяснить..

У меня есть дерево каталогов, которое выглядит так..

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

Внутри корневого каталога Code_Coverage_Test у меня есть файл Build.pl, который создает тесты для модуля и сценарий, который запускает два других сценария, которые автоматизируют некоторые команды для меня..

./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 dir у меня есть файлы, на которых я пытаюсь запустить покрытие кода..

Библиотека /testPLCoverage.pl

#!/usr/bin/perl -w

use strict;

print "Ok!";

Библиотека /testPMCoverage.pm

use strict;
use warnings;
package testPMCoverage;

sub hello {
    return "Hello";
}

sub bye {
    return "Bye";
}


1;

В t dir у меня есть мой тестовый файл.t для модуля и 2 скрипта, которые запускают тесты для меня.. Оба из них вызываются startTests.sh в корневом каталоге

т /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();

т /doPLtest.sh

#!/bin/sh

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

т /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 ответ

Решение

Perl не хранит полный путь к файлам, которые он использует. Если он находит файл по относительному пути, то сохраняется только относительный путь. Вы можете увидеть это в путях, которые Perl показывает в предупреждениях и сообщениях об ошибках из этих файлов.

Когда Devel::Cover имеет дело с файлами, он использует путь, заданный perl. Это можно увидеть в отчетах Devel::Cover, где у вас есть testPLCoverage.pl и blib/lib/testPMCoverage.pm.

На практике это означает, что всякий раз, когда вы помещаете покрытие в БД покрытия, вы должны убедиться, что вы делаете это из того же каталога, чтобы Devel::Cover мог сопоставлять и находить файлы в БД покрытия.

Я думаю, что это проблема, которую вы бьете.

Я предлагаю, чтобы в t/doPLtest.sh вы не переходили в lib. Вы можете запустить что-то вроде:

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

(Кстати, почему этот файл в lib?)

Я думаю, это будет означать, что Devel::Cover будет запускаться из корня проекта в каждом случае и поэтому должен позволять ему сопоставлять и находить файлы.

Другие вопросы по тегам