Сборка Perl, поблочное тестирование, кодирует покрытие: полный рабочий пример

Если вы используете IPython, вам нужно ввести «foo ??»

In [19]: foo??
Signature: foo(arg1, arg2)
Source:
def foo(arg1,arg2):
    #do something with args
    a = arg1 + arg2
    return a

File:      ~/Desktop/<ipython-input-18-3174e3126506>
Type:      function
83
задан Kurt W. Leucht 26 September 2009 в 03:00
поделиться

5 ответов

Это взяло меня некоторое время, и это также взяло меня берущий маленькие отрывки из многих других источников и расплавляющий их вместе, но я думаю, что у меня есть небольшой рабочий пример, который достаточно демонстрирует новичку Perl процесс сборки Perl включая поблочное тестирование и анализ покрытия кода & создание отчетов. (Я использую ActiveState ActivePerl v5.10.0 на Windows XP Pro ПК, Модуль:: Сборка , Тест:: Больше , Devel:: Покрытие )

Начинаются с каталогом для Вашего проекта 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.t". Этот файл является Вашим сценарием модульного теста, который попытается полностью протестировать Ваш модуль 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");

Теперь создают резервную копию в Вашем высокоуровневом каталоге проекта, создают текстовый файл, названный "Сборка. МН". Этот файл создаст Ваши сценарии сборки, которые Вы будете использовать позже. Вставьте следующее содержание в этот файл:

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". Войдите в тот каталог и двойной щелчок по файлу "coverage.html" для открытия отчета о покрытии кода в любимом веб-браузере. Это дает Вам, хороший цвет кодировал отчет гипертекста, где можно нажать имя файла и видеть подробный оператор, ответвление, условие, статистику покрытия подпрограммы для модуля Perl тут же в отчете рядом с фактическим исходным кодом. Вы видите в этом отчете, что мы не покрывали "до свидания ()" стандартная программа вообще и также существует строка кода, которая недостижима, который не был покрыт, как мы ожидали.

snapshot of code coverage report
(источник: leucht.com )

Еще одна вещь можно сделать, чтобы помочь автоматизировать этот процесс в IDE, должен сделать еще некоторую "Сборку. МН" файлы типа, которые явно выполняют некоторые цели сборки, которые мы сделали выше вручную из командной строки. Например, я использую "BuildTest. МН" файл со следующим содержанием:

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. МН") единственным щелчком мышью и это автоматически выполняет мой код модульного теста от IDE вместо меня делающий его вручную из командной строки. Замените "отправку ('тест')" "отправкой ('testcover')" для автоматизированного выполнения покрытия кода. Введите "Справку сборки" для полного списка целей сборки, которые доступны от Модуля:: Сборка.

102
ответ дан Glorfindel 24 November 2019 в 08:52
поделиться

В ответ на Kurt я предложил бы эту альтернативу его BuiltTest. МН сценарий.

use strict;
use warnings;
use Module::Build;

my $build = Module::Build->resume (
  properties => {
    config_dir => '_build',
  },
);

$build->dispatch('build');
$build->dispatch('test');

Это снова использует сборку базы данных Сборкой. МН (и таким образом предполагает, что уже работал).

14
ответ дан Leon Timmermans 24 November 2019 в 08:52
поделиться

Я покрываю это в Промежуточный Perl, а также Perl Освоения. Kurt, однако, дал хорошую сводку.

я комбинирую все это в сценарий выпуска с помощью Модуль:: Выпуск все же. Я ввожу одну команду, и все это происходит.

12
ответ дан brian d foy 24 November 2019 в 08:52
поделиться

Фантастически полезное module-starter генерирует простой в использовании скелетный проект, который обрабатывает установку модуля, создание документации и наглядности для файлов модуля для проживания в, и - я думаю - поддержка покрытия кода. Это - IMO большой запуск для любого Perl связанное с модулем усилие.

Также: использование CPAN-связанных инструментов как Module::Build - даже для модулей, которые, вероятно, никогда не будут выпущенными публично - , является очень хорошей идеей .

12
ответ дан Gaurav 24 November 2019 в 08:52
поделиться

(раскрытие: я автор)

После того, как вы все отсортировали, как описано выше, вы можете сделать следующий шаг и использовать Devel :: CoverX :: Covered , например,

  • Для исходного файла перечислить тестовые файлы, которые обеспечивают покрытие этого исходного файла. Это может быть сделано на уровне файла, подпрограммы и строки.
  • Для тестового файла укажите исходные файлы и подпрограммы, охватываемые этим тестовым файлом.
  • Для исходного файла эффективно составляйте отчет о деталях покрытия для каждой строки , или sub.

См. конкретные примеры командной строки в синопсисе .

В Devel :: PerlySense есть поддержка Emacs для отображения информации о покрытии в буфере исходного кода ( снимок экрана ), а также для перехода к закрывающим тестовым файлам и обратно.

7
ответ дан 24 November 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: