Сборка Perl, модульное тестирование, покрытие кода: полный рабочий пример
большинство ответов Stackoverflow, которые я нашел в отношении процесса сборки Perl и модульного тестирования и покрытия кода, просто указывают мне на CPAN для документации там. Нет абсолютно ничего плохого в указании на модули CPAN, потому что именно там должна находиться полная документация. Однако во многих случаях мне было трудно найти полные примеры рабочего кода.
Я искал по всему Интернету для реальных рабочих образцов кода, которые я могу загрузите или вставьте в мою среду IDE, как ваш типичный учебник" Hello World " пример исходного кода, но пример, который демонстрирует процесс сборки с модульным тестированием и анализом покрытия кода. У кого-нибудь есть небольшой пример полного рабочего проекта, который демонстрирует эти технологии и процессы?
(у меня есть небольшой рабочий пример, и я отвечу на свой собственный вопрос с ним, но, вероятно, есть и другие пользователи SO, у которых есть лучшие примеры, чем те, которые я пришел наверх.)
5 ответов:
мне потребовалось некоторое время, и мне также потребовалось взять небольшие фрагменты из нескольких разных источников и сплавить их вместе, но я думаю, что у меня есть небольшой рабочий пример, который достаточно демонстрирует новичку Perl процесс сборки Perl, включая модульное тестирование и анализ покрытия кода и отчетность. (Я использую ActiveState ActivePerl v5.10. 0 на ПК с Windows XP Pro, Модуль:: Build,Test:: More, Devel:: Cover)
начните с каталога для вашего проекта Perl, а затем создайте каталог " lib "и каталог" t " в каталоге вашего проекта:
HelloPerlBuildWorld | |----------> lib | |----------> t
в каталоге" lib " создайте текстовый файл с именем "HelloPerlBuildWorld.pm этот файл является вашим модулем Perl, который вы будете создавать и тестировать. Вставьте в этот файл следующее содержимое:
use strict; use warnings; package HelloPerlBuildWorld; $HelloPerlBuildWorld::VERSION = '0.1'; sub hello { return "Hello, Perl Build World!"; } sub bye { return "Goodbye, cruel world!"; } sub repeat { return 1; } sub argumentTest { my ($booleanArg) = @_; if (!defined($booleanArg)) { return "null"; } elsif ($booleanArg eq "false") { return "false"; } elsif ($booleanArg eq "true") { return "true"; } else { return "unknown"; } return "Unreachable code: cannot be covered"; } 1;
в каталоге" t " создайте текстовый файл с именем "HelloPerlBuildWorld.Т". Этот файл-ваш модульный тестовый скрипт, который попытается полностью протестировать ваш модуль Perl выше. Вставьте в этот файл следующее содержимое:
use strict; use warnings; use Test::More qw(no_plan); # Verify module can be included via "use" pragma BEGIN { use_ok('HelloPerlBuildWorld') }; # Verify module can be included via "require" pragma require_ok( 'HelloPerlBuildWorld' ); # Test hello() routine using a regular expression my $helloCall = HelloPerlBuildWorld::hello(); like($helloCall, qr/Hello, .*World/, "hello() RE test"); # Test hello_message() routine using a got/expected routine is($helloCall, "Hello, Perl Build World!", "hello() IS test"); # Do not test bye() routine # Test repeat() routine using a got/expected routine for (my $ctr=1; $ctr<=10; $ctr++) { my $repeatCall = HelloPerlBuildWorld::repeat(); is($repeatCall, 1, "repeat() IS test"); } # Test argumentTest() my $argumentTestCall1 = HelloPerlBuildWorld::argumentTest(); is($argumentTestCall1, "null", "argumentTest() IS null test"); # Test argumentTest("true") my $argumentTestCall2 = HelloPerlBuildWorld::argumentTest("true"); is($argumentTestCall2, "true", "argumentTest() IS true test"); # Test argumentTest("false") my $argumentTestCall3 = HelloPerlBuildWorld::argumentTest("false"); is($argumentTestCall3, "false", "argumentTest() IS false test"); # Test argumentTest(123) my $argumentTestCall4 = HelloPerlBuildWorld::argumentTest(123); is($argumentTestCall4, "unknown", "argumentTest() IS unknown test");
Теперь создайте резервную копию в каталоге проекта верхнего уровня, создайте текстовый файл с именем "Build.PL этот файл создаст ваши скрипты сборки, которые вы будете использовать позже. Вставьте в этот файл следующее содержимое:
use strict; use warnings; use Module::Build; my $builder = Module::Build->new( module_name => 'HelloPerlBuildWorld', license => 'perl', dist_abstract => 'HelloPerlBuildWorld short description', dist_author => 'Author Name <email_addy@goes.here>', build_requires => { 'Test::More' => '0.10', }, ); $builder->create_build_script();
это все файлы, которые вам нужны. Теперь из командной строки на верхнем уровне каталог проекта, введите следующую команду:
perl Build.PL
вы увидите что-то похожее на следующее:
Checking prerequisites... Looks good Creating new 'Build' script for 'HelloPerlBuildWorld' version '0.1'
теперь вы можете запускать модульные тесты с помощью следующей команды:
Build test
и видим что-то похожее на это:
Copying lib\HelloPerlBuildWorld.pm -> blib\lib\HelloPerlBuildWorld.pm t\HelloPerlBuildWorld....ok All tests successful. Files=1, Tests=18, 0 wallclock secs ( 0.00 cusr + 0.00 csys = 0.00 CPU)
чтобы запустить модульные тесты с анализом покрытия кода, попробуйте следующее:
Build testcover
и вы увидите что-то на порядок это:
t\HelloPerlBuildWorld....ok All tests successful. Files=1, Tests=18, 12 wallclock secs ( 0.00 cusr + 0.00 csys = 0.00 CPU) cover Reading database from D:/Documents and Settings/LeuchKW/workspace/HelloPerlBuildWorld/cover_db ----------------------------------- ------ ------ ------ ------ ------ ------ File stmt bran cond sub time total ----------------------------------- ------ ------ ------ ------ ------ ------ D:/Perl/lib/ActivePerl/Config.pm 0.0 0.0 0.0 0.0 n/a 0.0 D:/Perl/lib/ActiveState/Path.pm 0.0 0.0 0.0 0.0 n/a 0.0 D:/Perl/lib/AutoLoader.pm 0.0 0.0 0.0 0.0 n/a 0.0 D:/Perl/lib/B.pm 18.6 16.7 13.3 19.2 96.4 17.6 ... [SNIP] ... D:/Perl/lib/re.pm 0.0 0.0 0.0 0.0 n/a 0.0 D:/Perl/lib/strict.pm 84.6 50.0 50.0 100.0 0.0 73.1 D:/Perl/lib/vars.pm 44.4 36.4 0.0 100.0 0.0 36.2 D:/Perl/lib/warnings.pm 15.3 12.1 0.0 11.1 0.0 12.0 D:/Perl/lib/warnings/register.pm 0.0 0.0 n/a 0.0 n/a 0.0 blib/lib/HelloPerlBuildWorld.pm 87.5 100.0 n/a 83.3 0.0 89.3 Total 9.9 4.6 2.8 11.3 100.0 7.6 ----------------------------------- ------ ------ ------ ------ ------ ------ Writing HTML output to D:/Documents and Settings/LeuchKW/workspace/HelloPerlBuildWorld/cover_db/coverage.html ... done.
(кто-то, пожалуйста, скажите мне, как настроить обложку, чтобы игнорировать все библиотеки Perl, Кроме и просто сообщить мне о моем одном файле, который я написал. Я не мог заставить фильтрацию покрытия работать в соответствии с документацией CPAN!)
теперь, если вы обновите каталог верхнего уровня, вы можете увидеть новый подкаталог под названием "cover_db". Перейдите в этот каталог и дважды щелкните на "покрытие.html " файл для открытия отчета о покрытии кода в ваш любимый веб-браузер. Это дает вам хороший гипертекстовый отчет с цветовой кодировкой, в котором вы можете нажать на свое имя файла и увидеть подробную статистику оператора, ветви, условия, подпрограммы для вашего модуля Perl прямо в отчете рядом с фактическим исходным кодом. Вы можете видеть в этом отчете, что мы вообще не покрывали процедуру "bye ()", а также есть строка кода, которая недоступна, которая не была покрыта, как мы ожидали.
снимок покрытия кода отчет http://www.leucht.com/images/CodeCoverageExample.jpg
еще одна вещь, которую вы можете сделать, чтобы помочь автоматизировать этот процесс В вашей IDE, - это сделать еще немного "Build.PL" введите файлы, которые явно выполняют некоторые цели сборки, которые мы сделали выше вручную из командной строки. Например, я использую "BuildTest.PL" файл со следующим содержанием:
use strict; use warnings; use Module::Build; my $build = Module::Build->resume ( properties => { config_dir => '_build', }, ); $build->dispatch('build'); $build->dispatch('test');
затем я настроил свою IDE для выполнения этого файла (через "perl BuiltTest.PL") одним щелчком мыши и он автоматически запускает мой модульный тестовый код из IDE вместо того, чтобы я делал это вручную из командной строки. Замените "dispatch ('test')" на "dispatch ('testcover')" для автоматического выполнения покрытия кода. Введите "справка по сборке" для получения полного списка целей сборки, доступных в модуле::Build.
в ответ на Курта, я бы предложил эту альтернативу его BuiltTest.PL сценарий.
use strict; use warnings; use Module::Build; my $build = Module::Build->resume ( properties => { config_dir => '_build', }, ); $build->dispatch('build'); $build->dispatch('test');
он повторно использует сборку базы данных Build.PL (и при этом предполагает, что уже побежал).
Я об этом Промежуточный Perl а также Освоение Perl. Курт, однако, дал хорошее резюме.
я объединяю все это в сценарий выпуска с помощью Модуль:: Release хотя. Я набираю одну команду и все это происходит.
фантастически полезным
module-starter
создает простой в использовании скелетный проект, который обрабатывает установку модуля, создание документации и хороший макет для файлов модулей, чтобы жить, и -- I думаю -- покрытия кода поддержки. Это ИМО отличное начало для любых усилий, связанных с модулем Perl.также: использование CPAN-связанных инструментов, таких как
Module::Build
-- даже для модулей, которые, вероятно, никогда не будут выпущены публично -- - это очень хорошо идея.
(раскрытие: я-автор)
после того, как вы все отсортировали, как описано выше, вы можете сделать следующий шаг и использовать Devel:: CoverX:: Covered, например,
- учитывая исходный файл, перечислите тестовые файлы, которые обеспечивают покрытие для этого исходного файла. Это может быть сделано на уровне файла, подпрограммы и строки.
- учитывая тестовый файл, перечислите исходные файлы и суб, охваченные этим тестовым файлом.
- учитывая исходный файл, отчет эффективно на деталях покрытия в строке или подстроке.
посмотреть справка для конкретных примеров командной строки.
на Devel:: PerlySense есть поддержка Emacs для отображения информации о покрытии в буфере исходного кода (скриншот), и для перехода к/от покрытия тестовых файлов.