ฉันใช้เวลาสักพักและยังต้องใช้ตัวอย่างเล็ก ๆ น้อย ๆ จากแหล่งที่มาที่แตกต่างกันจำนวนมากและหลอมรวมเข้าด้วยกัน แต่ฉันคิดว่าฉันมีตัวอย่างการทำงานเล็ก ๆ ที่แสดงให้เห็นเพียงพอสำหรับมือใหม่ Perl กระบวนการสร้าง Perl รวมถึงการทดสอบหน่วยและการครอบคลุมโค้ด การวิเคราะห์และการรายงาน (ฉันใช้ActiveState ActivePerl v5.10.0 บนพีซี Windows XP Pro, Module :: 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.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.
(ใครบางคนช่วยบอกวิธีกำหนดค่า Cover ให้ละเว้นไลบรารี Perl ทั้งหมดยกเว้นและรายงานกลับมาให้ฉันในไฟล์เดียวที่ฉันเขียนฉันไม่สามารถรับ Cover filtering ให้ทำงานตามเอกสาร CPAN ได้!)
ตอนนี้ถ้าคุณรีเฟรชไดเรกทอรีระดับบนสุดคุณจะเห็นไดเร็กทอรีย่อยใหม่ชื่อ "cover_db" เข้าไปในไดเรกทอรีนั้นและดับเบิลคลิกที่ไฟล์ "coverage.html" เพื่อเปิดรายงานความครอบคลุมของโค้ดในเว็บเบราว์เซอร์ที่คุณชื่นชอบ ช่วยให้คุณมีรายงานไฮเปอร์เท็กซ์รหัสสีที่สวยงามซึ่งคุณสามารถคลิกที่ชื่อไฟล์ของคุณและดูคำชี้แจงโดยละเอียดสาขาเงื่อนไขสถิติการครอบคลุมรูทีนย่อยสำหรับโมดูล Perl ของคุณที่นั่นในรายงานถัดจากซอร์สโค้ดจริง คุณสามารถดูได้ในรายงานนี้ว่าเราไม่ได้กล่าวถึงกิจวัตร "ลาก่อน ()" เลยและยังมีบรรทัดรหัสที่ไม่สามารถเข้าถึงได้ซึ่งไม่ครอบคลุมตามที่เราคาดไว้
(ที่มา: 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')" สำหรับการดำเนินการครอบคลุมโค้ดอัตโนมัติ พิมพ์ "Build help" สำหรับรายการบิลด์เป้าหมายทั้งหมดที่พร้อมใช้งานจาก Module :: Build
Build build
แล้วBuild test
?