Phải mất tôi một lúc và tôi cũng lấy những đoạn trích nhỏ từ nhiều nguồn khác nhau và làm tan chảy chúng lại với nhau, nhưng tôi nghĩ tôi có một ví dụ nhỏ làm việc đủ để minh họa cho một người mới Perl quy trình xây dựng Perl bao gồm kiểm thử đơn vị và phân tích phạm vi mã & Báo cáo. (Tôi đang sử dụng ActiveState ActivePerl v5.10.0 trên Pro PC Windows XP, Module::Build, Test::More, Devel::Cover)
Bắt đầu với một thư mục cho dự án Perl của bạn và sau đó tạo ra một "lib" thư mục và "t" thư mục dưới thư mục dự án của bạn:
HelloPerlBuildWorld
|
|----------> lib
|
|----------> t
Trong thư mục "lib", tạo 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 đây 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 tệp văn bản có tên "HelloPerlBuildWorld.t". Tệp này là tập lệnh thử nghiệm đơ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 đây vào tệp này:
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");
Bây giờ sao lưu trong thư mục dự án cấp cao nhất của bạn, tạo tệp văn bản có tên "Build.PL". Tệp này sẽ tạo 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 đây 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 protected]>',
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, gõ 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 thử nghiệm đơn vị của bạn với lệnh sau đây:
Build test
Và thấy một cái gì đó tương tự như sau:
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ã số bảo hiểm, hãy thử này:
Build testcover
Và bạn sẽ thấy một cái gì đó về trình 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.
(Có người hãy cho tôi biết thế nào để 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 trên tập tin duy nhất của tôi mà tôi đã viết. Tôi không thể yêu cầu 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, bạn có thể thấy thư mục con mới có tên là "cover_db". Đi vào thư mục đó và nhấp đúp vào tệp "coverage.html" để mở báo cáo mức độ phù hợp mã trong trình duyệt web ưa 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 tốt nơi bạn có thể nhấp vào tên tệp của bạn và xem chi tiết câu lệnh, chi nhánh, điều kiện, thống kê bao phủ chương trình con cho mô-đun Perl của bạn ngay trong 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 bao gồm thường lệ "bye()" và cũng có một dòng mã không thể truy cập được mà không được bảo hiểm như chúng tôi mong đợi.
snapshot of code coverage report http://www.leucht.com/images/CodeCoverageExample.jpg
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 bạn là làm cho một số chi tiết "Build.PL" file kiểu đó thực hiện một cách rõ ràng một số các mục tiêu xây dựng mà chúng ta đã làm ở trên cách thủ công từ dòng lệnh. Ví dụ, tôi sử dụng một "BuildTest.PL" tập tin 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 lập IDE của tôi để thực hiện tập tin này (thông qua "perl BuiltTest.PL") với một click chuột duy nhấ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 nó theo cách thủ công từ dòng lệnh. Thay thế "dispatch ('test')" bằng "dispatch ('testcover')" để thực hiện bảo hiểm mã tự động. Nhập "Xây dựng trợ giúp" để 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.
Ý tưởng của bạn để thiết lập một tệp BuiltTest.PL không tốt cho tôi. Tại sao bạn không thể viết một kịch bản 'Build build' và' Build test'? –
Leon, bạn đang đề xuất một kịch bản perl mà làm cho các cuộc gọi dòng lệnh? Nếu vậy, tôi không muốn thực hiện các cuộc gọi dòng lệnh nếu có một cách OO để thực hiện các cuộc gọi lập trình như trong tệp ví dụ BuiltTest.PL. –
Điều đó không cần thiết, hãy xem câu trả lời của riêng tôi –