Menu

Perl. Тестирование кода. Лучшие практики. Установка зависимых пакетов

by wa   23.03.2015    3668 просмотров

В ходе изучения языка программирования Perl и поиска вариантов решения некоторых вопросов, а именно как лучше тестировать написанный модуль на Perl нашёл следующие статьи:

Нефункциональное модульное тестирование — «главное чтобы блестел».

Нефункциональное модульное тестирование — «главное чтобы блестел». Часть 2

Начнём сначала ставим через cpan Module::Starter:

$ cpan Module::Starter
CPAN: Storable loaded ok (v2.20)
Going to read '/root/.cpan/Metadata'
  Database was generated on Mon, 13 Oct 2014 12:41:02 GMT

# Дальше ещё много строк + установка зависимостей

Appending installation info to /usr/lib64/perl5/perllocal.pod
XSAWYERX/Module-Starter-1.71.tar.gz
/usr/bin/make install -- OK

Ура, поставилось. Поплыли дальше, делаем пакет через Module-Starter:

module-starter --mi --module=Badeud::Module --author="wa" --email="[email protected]"
Added to MANIFEST: Changes
Added to MANIFEST: ignore.txt
Added to MANIFEST: lib/Badeud/Module.pm
Added to MANIFEST: Makefile.PL
Added to MANIFEST: MANIFEST
Added to MANIFEST: README
Added to MANIFEST: t/00-load.t
Added to MANIFEST: t/manifest.t
Added to MANIFEST: t/pod-coverage.t
Added to MANIFEST: t/pod.t
Added to MANIFEST: xt/boilerplate.t
Created starter directories and files

Получаем вот такую структуру кода. Попробуем оттестировать код:

-bash-4.1$ perl Makefile.PL
include /root/Badeud-Module/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/Makefile.pm
include inc/Module/Install/AutoInstall.pm
include inc/Module/Install/Include.pm
include inc/Module/AutoInstall.pm
*** Module::AutoInstall version 1.12
*** Checking for Perl dependencies...
[Core Features]
- Test::More ...loaded. (1.001003)
*** Module::AutoInstall configuration finished.
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Win32.pm
include inc/Module/Install/Can.pm
include inc/Module/Install/Fetch.pm
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Badeud::Module
Writing MYMETA.yml and MYMETA.json
Writing META.yml
-bash-4.1$ make test
cp lib/Badeud/Module.pm blib/lib/Badeud/Module.pm
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/00-load.t ....... 1/? # Testing Badeud::Module 0.01, Perl 5.010001, /usr/bin/perl
t/00-load.t ....... ok
t/manifest.t ...... skipped: Author tests not required for installation
t/pod-coverage.t .. skipped: Author tests not required for installation
t/pod.t ........... skipped: Author tests not required for installation
All tests successful.
Files=4, Tests=1, 1 wallclock secs ( 0.02 usr 0.01 sys + 0.07 cusr 0.01 csys = 0.11 CPU)
Result: PASS

Вроде всё ок, попробуем дальше по статье. Далее по тексту нас просят последовательно создавать дополнительные файлы тестов и править уже существующие:

t/01-strict.t
t/02-fixme.t
t/03-critic.t
t/08-code-coverage.t
t/09-kwalitee.t

И тут всё посыпалось...

$ make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/00-load.t ........... 1/? # Testing Badeud::Module 0.01, Perl 5.010001, /usr/bin/perl
t/00-load.t ........... ok
t/01-strict.t ......... Can't locate Test/Strict.pm in @INC
# и так далее..
Test Summary Report
-------------------
t/01-strict.t (Wstat: 512 Tests: 0 Failed: 0)
Non-zero exit status: 2
Parse errors: No plan found in TAP output
t/02-fixme.t (Wstat: 512 Tests: 0 Failed: 0)
Non-zero exit status: 2
Parse errors: No plan found in TAP output
t/03-critic.t (Wstat: 512 Tests: 0 Failed: 0)
Non-zero exit status: 2
Parse errors: No plan found in TAP output
t/08-code-coverage.t (Wstat: 512 Tests: 0 Failed: 0)
Non-zero exit status: 2
Parse errors: No plan found in TAP output
Files=9, Tests=1, 0 wallclock secs ( 0.04 usr 0.02 sys + 0.11 cusr 0.02 csys = 0.19 CPU)
Result: FAIL
Failed 4/9 test programs. 0/1 subtests failed.
make: *** [test_dynamic] Ошибка 255

Казалось бы всё логично, что нет такого пакета Test::Strict, Test::Critic и так далее, ну что ж ставим в лоб через cpan, но тут возникает проблема зависимостей. При установке ставятся ещё зависимые пакеты, которые зависят от ещё других (Devel::Cover) и ирония судьбы всё валится на тестах... Ничего не поставилось. Грусть, печаль.

Гуглим и найдено в топе Как устанавливать Perl-модули? (на английском), но вы не исчерпывающий ресурс...

На Linux Ubuntu/Mint я отделался установкой только этих пакетов (искал тут Software Portal - Linux Mint Community), остальные ставил через cpan:

apt-get install libtest-strict-perl
apt-get install libtest-fixme-perl
apt-get install libtest-perl-critic-perl
apt-get install libtest-kwalitee-perl

На CentOS/Red Hat нашёл такой способ установки perl-модулей

yum install “perl(Module::Name)”

, но он как-то не заработал, а другой способ:

$ yum install perl-Test-Strict
Загружены модули: fastestmirror
Подготовка к установке
Loading mirror speeds from cached hostfile
* base: mirror.corbina.net
* epel: mirror.logol.ru
* extras: mirror.corbina.net
* rpmforge: ftp.nluug.nl
* updates: mirror.corbina.net
Пакет perl-Test-Strict-* недоступен.
Ошибка: Выполнять нечего

Пришлось ставить через cpan

cpan Test::Strict

Нашёл тут Fedora and Centos CPAN RPMs ссылку на гугл док со списком и именами пакетов perl-модулей для CentOS <a href="">https://spreadsheets.google.com/pub?hl=en_GB&hl=en_GB&key=0AuW8ZdOQ_GW1dGVic2x4akhRY1lWRzRCUjBxSE9lTHc&output=html</a>

$ yum install perl-Test-Perl-Critic ok

Вроде всё поставил, ну что ж проверим?

$ make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/00-load.t ........... 1/? # Testing Badeud::Module 0.01, Perl 5.010001, /usr/bin/perl
t/00-load.t ........... ok
t/01-strict.t ......... ok
t/02-fixme.t .......... ok
t/03-critic.t ......... ok
t/08-code-coverage.t .. 3/? # Testing Badeud::Module 0.01, Perl 5.010001, /usr/bin/perl
t/08-code-coverage.t .. ok
t/09-kwalitee.t ....... skipped: Test::Kwalitee not installed; skipping
t/pod-coverage.t ...... skipped: Author tests not required for installation
t/pod.t ............... skipped: Author tests not required for installation
All tests successful.
Files=8, Tests=14, 4 wallclock secs ( 0.04 usr 0.01 sys + 3.81 cusr 0.27 csys = 4.13 CPU)
Result: PASS

Наконец-то, все зависимости удовлетворены и пакеты установлены, теперь можно писать модуль + тесты под него, которые автоматически подхватятся из каталога t.