2012-08-23 17 views
5

Tôi đang thực hành để tạo mô-đun mới bằng Module :: Starter. Tôi đã viết một vài trường hợp thử nghiệm cho một gói, và họ chạy OK đôi khi.Làm cách nào để gỡ lỗi mô-đun được tạo bởi Module :: Starter?

Tuy nhiên tôi nhận thấy có hai vấn đề:

  • Khi các trường hợp thử nghiệm thất bại, tôi muốn đặt một số báo cáo in trong hàm đang được thử nghiệm. Tôi chạy make test và nó chỉ cho tôi biết rằng các trường hợp thử nghiệm của tôi không thành công, nó không hiển thị đầu ra được in của tôi, mặc dù tôi thực sự chắc chắn rằng các báo cáo in đạt được.

  • Giả sử tôi có ba trường hợp thử nghiệm để kiểm tra một hàm, tôi đặt một lệnh in bên trong hàm, khi các trường hợp thử chạy, nó báo cáo rằng chỉ có 1 trong ba trường hợp thử nghiệm được chạy. Nếu tôi xóa câu lệnh in, cả ba trường hợp kiểm tra sẽ chạy. Tại sao vậy?

Dưới đây là mã của tôi:

# package declaration and stuff... 
sub get_in { 
    my ($hash, @path) = @_; 
    my $ref = $hash; 
    print 'lol'; # This is the troublesome print statement. Remove this statement and all three test cases will run and pass 
    foreach (@path) { 
    if (ref($ref) eq 'HASH' && exists $ref->{$_}) { 
     $ref = $ref->{$_}; 
    } else { 
     return undef; 
    } 
    } 
    return $ref; 
} 

Đây là trường hợp thử nghiệm:

use Test::More tests => 3; 
use strict; 
use warnings; 
use diagnostics; 
require_ok('Foo::Doc'); 
ok(Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c') == 101); 
ok(@{ Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => [ 1, 2, 3 ] } } }, 'a', 'b', 'c') } == @{ [ 1, 2, 3 ] }); 
+3

Câu hỏi này không thực sự cụ thể đối với Mô-đun :: Người khởi xướng. Bố cục chuẩn của dự án Perl bao gồm một thư mục 't' với các phép thử' * .t' bằng cách sử dụng Test :: Simple hoặc Test :: More hoặc một số để kiểm tra thành công hoặc thất bại đầu ra. Mỗi bộ công cụ xây dựng Perl cung cấp các công cụ để chạy thử nghiệm của bạn và xuất kết quả trong báo cáo chuẩn bằng cách sử dụng các công cụ được cung cấp trong lõi Perl. – zostay

Trả lời

7

Có một vài vấn đề với bạn kiểm tra mà cần phải được giải quyết cũng như câu hỏi của bạn thân . Trước tiên hãy đặt câu hỏi của bạn:

Nếu bạn muốn đầu ra hiển thị trong các thử nghiệm, bạn cần in rõ ràng lỗi chuẩn. Để thực hành tốt nhất, bạn cũng cần đầu ra của mình được bắt đầu bằng #. Mô-đun Test::More cung cấp các công cụ bạn có thể sử dụng để thực hiện việc này một cách dễ dàng.

my $got = Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c'); 
ok($got == 101); # you probably want is() instead, see below 
diag("GOT $got"); # outputs "# GOT 101" or whatever to STDERR 

Nếu bạn không muốn in ra rằng mỗi lần, nhưng chỉ khi tiết đăng nhập được yêu cầu, bạn có thể sử dụng note:

note("GOT $got"); 

này rất hữu ích khi bạn sử dụng prove -v chạy của bạn kiểm tra:

prove -l -v t/test.t 

ngoài ra còn có một explain chức năng đó sẽ đổ ra đầu ra phức tạp để xem:

diag explain $got; 
# OR 
note explain $got; 

Còn về các vấn đề khác của bạn. Nó thường thích hợp hơn để sử dụng is()-ok():

is($got, 101); # gives slightly more readable output on error 

Ngoài ra, khi kiểm tra cấu trúc dữ liệu phức tạp bạn cần phải sử dụng is_deeply() để thực hiện một sự so sánh đầy đủ:

is_deeply($got, [1, 2, 3]); 

Bạn chắc chắn nên xem xét các tài liệu của Test::More vì có rất nhiều thông tin hữu ích trong đó.

2

Để giải quyết câu hỏi thứ hai của bạn, bạn muốn viết cẩn thận với đầu ra tiêu chuẩn trong các tập lệnh thử nghiệm. Test::More quét kết quả đầu ra tiêu chuẩn tìm kiếm kết quả kiểm tra kín như ok 5not ok 6 - disgronificator enabled.Khi bạn viết "lol" vào đầu ra tiêu chuẩn nhưng không nối thêm một dòng mới, mô-đun thử nghiệm sẽ đặt "lolok 9 - it works" và không nhận ra nó là kết quả thử nghiệm. (Để có thêm niềm vui, hãy đặt các câu lệnh print "not "; trước tất cả các bài kiểm tra của bạn).

Thực hành tốt hơn giống như zostay nói, để ghi vào lỗi chuẩn, sử dụng diag và các chức năng đầu ra khác mà Test::More cung cấp.

Các vấn đề liên quan