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 будет запускаться из корня проекта в каждом случае и поэтому должен позволять ему сопоставлять и находить файлы.