Butuh beberapa saat dan saya juga mengambil cuplikan kecil dari sejumlah sumber yang berbeda dan meleburnya bersama-sama, tapi saya rasa saya memiliki contoh kerja kecil yang cukup menunjukkan kepada pemula Perl proses pembuatan Perl termasuk pengujian unit dan cakupan kode analisis & pelaporan. (Saya menggunakan ActiveState ActivePerl v5.10.0 pada PC Windows XP Pro, Module :: Build , Test :: More , Devel :: Cover )
Mulailah dengan direktori untuk proyek Perl Anda dan kemudian buat direktori "lib" dan direktori "t" di bawah direktori proyek Anda:
HelloPerlBuildWorld
|
|----------> lib
|
|----------> t
Di direktori "lib", buat file teks bernama "HelloPerlBuildWorld.pm". File ini adalah modul Perl Anda yang akan Anda buat dan uji. Tempel konten berikut ke dalam file ini:
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;
Di direktori "t", buat file teks bernama "HelloPerlBuildWorld.t". File ini adalah skrip pengujian unit Anda yang akan mencoba sepenuhnya menguji modul Perl Anda di atas. Tempel konten berikut ke dalam file ini:
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");
Sekarang kembali ke direktori proyek tingkat atas Anda, buat file teks bernama "Build.PL". File ini akan membuat skrip build yang akan Anda gunakan nanti. Tempel konten berikut ke dalam file ini:
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();
Itu saja file yang Anda butuhkan. Sekarang dari baris perintah di direktori proyek tingkat atas, ketik perintah berikut:
perl Build.PL
Anda akan melihat sesuatu yang mirip dengan berikut ini:
Checking prerequisites...
Looks good
Creating new 'Build' script for 'HelloPerlBuildWorld' version '0.1'
Sekarang Anda harus dapat menjalankan pengujian unit Anda dengan perintah berikut:
Build test
Dan lihat sesuatu yang mirip dengan ini:
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)
Untuk menjalankan pengujian unit Anda dengan analisis cakupan kode, coba ini:
Build testcover
Dan Anda akan melihat sesuatu dalam urutan ini:
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.
(Seseorang tolong beri tahu saya cara mengkonfigurasi Cover untuk mengabaikan semua pustaka Perl kecuali dan laporkan kembali kepada saya pada file tunggal yang saya tulis. Saya tidak bisa mendapatkan Cover filtering untuk bekerja sesuai dengan dokumentasi CPAN!)
Sekarang jika Anda menyegarkan direktori tingkat atas, Anda dapat melihat subdirektori baru bernama "cover_db". Masuk ke direktori itu dan klik dua kali pada file "coverage.html" untuk membuka laporan cakupan kode di browser web favorit Anda. Ini memberi Anda laporan hypertext berkode warna yang bagus di mana Anda dapat mengklik nama file Anda dan melihat pernyataan rinci, cabang, kondisi, statistik cakupan subrutin untuk modul Perl Anda tepat di laporan di sebelah kode sumber sebenarnya. Anda dapat melihat di laporan ini bahwa kami tidak mencakup rutinitas "bye ()" sama sekali dan juga ada baris kode yang tidak dapat dijangkau yang tidak tercakup seperti yang kami harapkan.
(sumber: leucht.com )
Satu hal lagi yang dapat Anda lakukan untuk membantu mengotomatiskan proses ini di IDE Anda adalah membuat beberapa file jenis "Build.PL" yang secara eksplisit menjalankan beberapa target build yang kami lakukan di atas secara manual dari baris perintah. Misalnya, saya menggunakan file "BuildTest.PL" dengan konten berikut:
use strict;
use warnings;
use Module::Build;
my $build = Module::Build->resume (
properties => {
config_dir => '_build',
},
);
$build->dispatch('build');
$build->dispatch('test');
Kemudian saya menyiapkan IDE saya untuk menjalankan file ini (melalui "perl BuiltTest.PL") dengan satu klik mouse dan secara otomatis menjalankan kode pengujian unit saya dari IDE alih-alih saya melakukannya secara manual dari baris perintah. Ganti "dispatch ('test')" dengan "dispatch ('testcover')" untuk eksekusi cakupan kode otomatis. Ketik "Bantuan build" untuk daftar lengkap target build yang tersedia dari Module :: Build.
Build build
dan kemudianBuild test
?