Perl 빌드, 단위 테스트, 코드 커버리지 : 완전한 작동 예제


86

Perl 빌드 프로세스 및 단위 테스트 및 코드 커버리지와 관련하여 찾은 대부분의 Stackoverflow 답변은 해당 문서에 대한 CPAN을 가리 킵니다. CPAN 모듈을 가리키는 데 전혀 문제가 없습니다. 전체 문서가 있어야하기 때문입니다. 그래도 많은 경우에 완전한 작동 코드 예제를 찾는 데 어려움이있었습니다.

일반적인 자습서 "Hello World"예제 소스 코드와 같이 IDE에 다운로드하거나 붙여 넣을 수있는 실제 작업 코드 샘플을 인터넷에서 검색했지만 단위 테스트 및 코드를 사용하여 빌드 프로세스를 보여주는 예제입니다. 커버리지 분석. 누구든지 이러한 기술과 프로세스를 보여주는 완전한 작업 프로젝트의 작은 예를 가지고 있습니까?

(저는 작은 작업 예제를 가지고 있으며 제 질문에 답할 것입니다.하지만 제가 생각 해낸 것보다 더 나은 예제를 가진 다른 SO 사용자가있을 것입니다.)

답변:


105

시간이 좀 걸렸고 여러 소스에서 작은 스 니펫을 가져 와서 함께 녹이는데도 걸렸지 만 Perl 초보자에게 단위 테스트 및 코드 커버리지를 포함한 Perl 빌드 프로세스를 충분히 보여주는 작은 작업 예제가 있다고 생각합니다. 분석 및보고. ( Windows XP Pro PC, Module :: Build , Test :: More , Devel :: Cover 에서 ActiveState ActivePerl v5.10.0을 사용하고 있습니다. )

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");

이제 최상위 프로젝트 디렉토리에 백업하고 "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 라이브러리를 무시하도록 Cover를 구성하는 방법을 알려주십시오. CPAN 문서에 따라 작동하도록 Cover 필터링을 얻을 수 없었습니다!)

이제 최상위 디렉토리를 새로 고치면 "cover_db"라는 새 하위 디렉토리를 볼 수 있습니다. 해당 디렉토리로 이동하여 "coverage.html"파일을 두 번 클릭하여 즐겨 찾는 웹 브라우저에서 코드 검사 보고서를 엽니 다. 파일 이름을 클릭하고 실제 소스 코드 옆에있는 보고서에서 바로 Perl 모듈에 대한 세부 설명, 분기, 조건, 서브 루틴 범위 통계를 볼 수있는 멋진 색상 코드 하이퍼 텍스트 보고서를 제공합니다. 이 보고서에서 "bye ()"루틴을 전혀 다루지 않았으며 예상대로 다루지 않은 도달 할 수없는 코드 줄이 있음을 알 수 있습니다.

코드 커버리지 보고서의 스냅 샷
(출처 : leucht.com )

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')"로 바꿉니다. Module :: Build에서 사용할 수있는 빌드 대상의 전체 목록을 보려면 "Build help"를 입력하십시오.


1
BuiltTest.PL을 설정하려는 당신의 생각은 나에게 좋지 않습니다. 왜 Build build그런 다음 스크립트를 작성할 수 Build test없습니까?
Leon Timmermans

2
레온, 명령 줄 호출을하는 펄 스크립트를 제안하는 건가요? 그렇다면 예제 BuiltTest.PL 파일에서와 같이 프로그래밍 방식으로 호출을 수행하는 OO 방법이있는 경우 명령 줄 호출을하지 않는 것이 좋습니다.
Kurt W. Leucht

1
필요하지 않습니다. 내 답변 참조
Leon Timmermans

2
Module :: Build는 CPAN을위한 것이 아닙니다. CPAN에없는 경우에도 다양한 CPAN 도구에서 모든 기능을 얻을 수 있습니다. 비공개 모듈이더라도 동일한 프로세스로 빌드, 테스트, 배포 및 설치할 수 있습니다.
브라이언 디 포이

4
Devel :: Cover에서 결과를 필터링하려면에 옵션을 추가합니다 $ENV{HARNESS_PERL_SWITCHES}. 예 : 애플리케이션 개인용 라이브러리는 -MDevel::Cover=+ignore,.t$,+inc,/app/lib,-select,MyModule.pm어디 /app/lib이며 MyModule.pm테스트중인 모듈입니다.
Michael Carman

14

Kurt에 대한 응답으로, 그의 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에 의한 데이터베이스 빌드를 재사용합니다 (따라서 이미 실행되었다고 가정합니다).


완전한! 고마워, 레온. 내 예제에 문제가 있다는 것을 알았지 만 여전히이 펄 빌드를 처음 접했습니다! :-)
Kurt W. Leucht


12

환상적으로 도움이 module-starter모듈을 설치, 문서의 생성과 살기 모듈 파일에 대한 좋은 레이아웃을 처리하는 사용하기 쉬운 골격 프로젝트를 생성하고, - 나는 생각한다 - 코드 커버리지 지원. IMO는 모든 Perl 모듈 관련 노력을위한 훌륭한 시작입니다.

또한 : Module::Build공개적으로 출시되지 않을 가능성이 높은 모듈에도 CPAN 관련 도구를 사용 하는 것은 매우 좋은 생각 입니다.


7

(공개 : 저자입니다)

위에서 설명한대로 모든 항목을 정렬했으면 다음 단계를 수행하여 Devel :: CoverX :: Covered 를 사용하여 예를 들어

  • 소스 파일이 주어지면 해당 소스 파일에 적용 범위를 제공하는 테스트 파일을 나열하십시오. 이것은 파일, 하위 루틴 및 행 레벨에서 수행 될 수 있습니다.
  • 테스트 파일이 주어지면 해당 테스트 파일에 포함 된 소스 파일과 하위 파일을 나열합니다.
  • 소스 파일이 주어지면 행 또는 하위 당 적용 범위 세부 정보를 효율적으로보고합니다.

구체적인 명령 줄 예제 는 개요 를 참조하십시오 .

에서 (STABLE) : PerlySense 소스 코드 버퍼 (의 커버리지 정보를 표시 할 이맥스 지원이의 스크린 샷 ), 테스트 파일을 덮고에서 /로 이동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.