시간이 좀 걸렸고 여러 소스에서 작은 스 니펫을 가져 와서 함께 녹이는데도 걸렸지 만 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);
BEGIN { use_ok('HelloPerlBuildWorld') };
require_ok( 'HelloPerlBuildWorld' );
my $helloCall = HelloPerlBuildWorld::hello();
like($helloCall, qr/Hello, .*World/, "hello() RE test");
is($helloCall, "Hello, Perl Build World!", "hello() IS test");
for (my $ctr=1; $ctr<=10; $ctr++) {
my $repeatCall = HelloPerlBuildWorld::repeat();
is($repeatCall, 1, "repeat() IS test");
}
my $argumentTestCall1 = HelloPerlBuildWorld::argumentTest();
is($argumentTestCall1, "null", "argumentTest() IS null test");
my $argumentTestCall2 = HelloPerlBuildWorld::argumentTest("true");
is($argumentTestCall2, "true", "argumentTest() IS true test");
my $argumentTestCall3 = HelloPerlBuildWorld::argumentTest("false");
is($argumentTestCall3, "false", "argumentTest() IS false test");
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"를 입력하십시오.
Build build
그런 다음 스크립트를 작성할 수Build test
없습니까?