Tôi đã mất một lúc và tôi cũng phải lấy các đoạn trích nhỏ từ một số nguồn khác nhau và làm tan chúng lại với nhau, nhưng tôi nghĩ rằng tôi có một ví dụ làm việc nhỏ đủ chứng minh cho người mới chơi Perl về quy trình xây dựng Perl bao gồm kiểm tra đơn vị và phạm vi mã phân tích và báo cáo. (Tôi đang sử dụng ActiveState ActivePerl v5.10.0 trên PC chạy Windows XP Pro, Mô-đun :: Xây dựng , Kiểm tra :: Thêm , Devel :: Bìa )
Bắt đầu với thư mục cho dự án Perl của bạn và sau đó tạo thư mục "lib" và thư mục "t" trong thư mục dự án của bạn:
HelloPerlBuildWorld
|
|----------> lib
|
|----------> t
Trong thư mục "lib", tạo một tệp văn bản có tên "HelloPerlBuildWorld.pm". Tệp này là mô-đun Perl của bạn mà bạn sẽ xây dựng và thử nghiệm. Dán nội dung sau vào tệp này:
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;
Trong thư mục "t", tạo một tệp văn bản có tên "HelloPerlBuildWorld.t". Tệp này là tập lệnh kiểm tra đơn vị của bạn sẽ cố gắng kiểm tra đầy đủ mô-đun Perl của bạn ở trên. Dán nội dung sau vào tệp này:
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");
Bây giờ sao lưu trong thư mục dự án cấp cao nhất của bạn, tạo một tệp văn bản có tên "Build.PL". Tệp này sẽ tạo các tập lệnh xây dựng của bạn mà bạn sẽ sử dụng sau này. Dán nội dung sau vào tệp này:
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();
Đó là tất cả các tệp bạn cần. Bây giờ từ dòng lệnh trong thư mục dự án cấp cao nhất, hãy nhập lệnh sau:
perl Build.PL
Bạn sẽ thấy một cái gì đó tương tự như sau:
Checking prerequisites...
Looks good
Creating new 'Build' script for 'HelloPerlBuildWorld' version '0.1'
Bây giờ bạn sẽ có thể chạy các bài kiểm tra đơn vị của mình bằng lệnh sau:
Build test
Và xem một cái gì đó tương tự như thế này:
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)
Để chạy thử nghiệm đơn vị của bạn với phân tích mức độ phù hợp mã, hãy thử cách này:
Build testcover
Và bạn sẽ thấy một cái gì đó theo thứ tự này:
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.
(Ai đó vui lòng cho tôi biết cách định cấu hình Cover để bỏ qua tất cả các thư viện Perl ngoại trừ và chỉ báo cáo lại cho tôi về tệp duy nhất mà tôi đã viết. Tôi không thể làm cho tính năng lọc Cover hoạt động theo tài liệu CPAN!)
Bây giờ, nếu bạn làm mới thư mục cấp cao nhất của mình, bạn có thể thấy một thư mục con mới có tên "cover_db". Đi vào thư mục đó và nhấp đúp vào tệp "secure.html" để mở báo cáo phạm vi mã trong trình duyệt web yêu thích của bạn. Nó cung cấp cho bạn một báo cáo siêu văn bản được mã hóa màu sắc đẹp mắt, nơi bạn có thể nhấp vào tên tệp của mình và xem các thống kê chi tiết về báo cáo, nhánh, điều kiện, mức độ phù hợp chương trình con cho mô-đun Perl của bạn ngay tại báo cáo bên cạnh mã nguồn thực tế. Bạn có thể thấy trong báo cáo này rằng chúng tôi đã không đề cập đến quy trình "tạm biệt ()" và cũng có một dòng mã không thể truy cập được không được đề cập như chúng tôi mong đợi.
(nguồn: leucht.com )
Một điều nữa bạn có thể làm để giúp tự động hóa quá trình này trong IDE của mình là tạo thêm một số tệp loại "Build.PL" thực hiện rõ ràng một số mục tiêu xây dựng mà chúng tôi đã thực hiện ở trên theo cách thủ công từ dòng lệnh. Ví dụ: tôi sử dụng tệp "BuildTest.PL" với nội dung sau:
use strict;
use warnings;
use Module::Build;
my $build = Module::Build->resume (
properties => {
config_dir => '_build',
},
);
$build->dispatch('build');
$build->dispatch('test');
Sau đó, tôi thiết lập IDE của mình để thực thi tệp này (thông qua "perl BuiltTest.PL") bằng một cú nhấp chuột và nó tự động chạy mã kiểm tra đơn vị của tôi từ IDE thay vì tôi thực hiện thủ công từ dòng lệnh. Thay thế "công văn ('kiểm tra')" bằng "công văn ('testcover')" để thực thi phạm vi mã tự động. Nhập "Trợ giúp xây dựng" để có danh sách đầy đủ các mục tiêu xây dựng có sẵn từ Mô-đun :: Xây dựng.
Build build
và sau đóBuild test
?