2010-03-18 34 views
5

Tôi là một chút mới cho mô-đun Devel :: Cover, nhưng đã tìm thấy nó rất hữu ích trong việc đảm bảo rằng tôi không thiếu kiểm tra.Làm cách nào tôi có thể nhận được phạm vi kiểm tra 100% trong mô-đun Perl sử dụng DBI?

Sự cố mà tôi đang gặp phải là hiểu báo cáo từ Devel :: Cover. Tôi đã xem tài liệu, nhưng không thể tìm ra những gì tôi cần để kiểm tra để có được mức độ phù hợp 100%.

Sửa - Tôi nên làm cho nó rõ ràng rằng tôi không nói rằng tôi cần% bảo hiểm 100, bởi vì như nhiều người chỉ ra, 100% bảo hiểm là một thuật ngữ lỏng lẻo, không không có nghĩa là mã của tôi là lỗi miễn phí và có thể không hoàn toàn là cần thiết. Vì tôi mới ở số Devel :: Cover, tôi muốn biết lý do tại sao mã của tôi không phải là 100% bảo hiểm, trong trường hợp tôi thiếu một số kiểm tra quan trọng .

Đây là kết quả từ báo cáo bìa:

line err stmt bran cond sub pod time code 
... 
36             sub connect_database { 
37    3     3  1 1126  my $self = shift; 
38    3 100       24  if (!$self->{dsn}) { 
39    1         7   croak 'dsn not supplied - cannot connect'; 
40              } 
41 ***  2   33     21  $self->{dbh} = DBI->connect($self->{dsn}, q{}, q{}) 
42               || croak "$DBI::errstr"; 
43    1         11  return $self; 
44             } 
... 
line err  %  l !l&&r !l&&!r expr 
----- --- ------ ------ ------ ------ ---- 
41 ***  33  1  0  0 'DBI'->connect($$self{'dsn'}, '', '') || croak("$DBI::errstr") 

Và đây là và ví dụ về mã của tôi mà kiểm tra dòng cụ thể này:

my $database = MyModule::Database->new({ dsn => 'Invalid DSN' }); 
throws_ok(sub { $database->connect_database() }, 
    qr/Can't connect to data source/, 
    'Test connection exception (invalid dsn)'); 

thử nghiệm này đi - các kết nối không ném một lỗi và hoàn thành bài kiểm tra "throws_ok" của tôi.

Tôi có một số bài kiểm tra để kết nối thành công, đó là lý do tại sao tôi nghĩ rằng tôi có mức độ phù hợp 33%, nhưng nếu tôi đọc chính xác, hãy nghĩ rằng tôi không thử nghiệm phần "|| croak" tuyên bố. Tôi nghĩ rằng tôi đã, với thử nghiệm "throws_ok", nhưng rõ ràng là tôi đang thiếu một cái gì đó.

Có ai có lời khuyên về cách tôi có thể kiểm tra DBI-> đường kết nối của mình thành công không?

Cảm ơn!

Edit:

brian tipped tôi tắt báo cáo HTML và bảng chân lý giải thích tại sao dòng # 41 không đi qua. Vấn đề duy nhất là tôi không thể hiểu được nó đang nói gì với tôi. Tôi đoán cốt lõi thực sự của câu hỏi của tôi là tại sao dòng này cụ thể không vượt qua phạm vi bảo hiểm.

Dưới đây là bảng sự thật:

LINE # % # coverage # condition 
41 # 33 # A | B | deC# 'DBI'->connect($$self{'dsn'}, '', '') || croak("$DBI::errstr") 
    # # 0 | 0 | 0 # 
    # # 0 | 1 | 1 # 
    # # 1 | X | 1 # (THIS LINE IS Green - the rest are red) 

Nếu bất cứ ai có thể giúp giải thích bảng sự thật này, tôi muốn đánh giá cao nó. Nó cũng đã được đề cập rằng để vượt qua phạm vi bảo hiểm tôi cần phải có một đối tượng cơ sở dữ liệu giả, nhưng tôi không hoàn toàn thấy làm thế nào bất cứ điều gì trong các kết quả bảo hiểm mà sẽ dẫn tôi vào điều này.

Cảm ơn bạn lần nữa!

+1

Cố gắng để có được bảo hiểm đầy đủ điều kiện có lẽ là lãng phí nỗ lực. Bảo hiểm chi nhánh phải là quá đủ. Nếu mã của bạn là rất quan trọng mà bạn cần bảo hiểm điều kiện bạn không nên viết nó trong Perl. Là một lợi ích phụ, Devel :: Cover chạy nhanh hơn nhiều khi bạn không thu thập dữ liệu phủ sóng của điều kiện. –

+0

"Phạm vi phủ sóng 100%" vẫn vô nghĩa nếu bạn không đủ điều kiện bạn đang bảo hiểm như thế nào. Bảo hiểm dòng? Bảo hiểm chi nhánh? Bảo hiểm đường dẫn? Mỗi cấp độ có độ tin cậy và độ khó thực hiện khác nhau. Thậm chí sau đó, bạn đang xem xét hoàn vốn cho thời gian đầu tư. Đây có phải là một hệ thống an toàn quan trọng có thể giết người không? Trong trường hợp đó, phạm vi phủ sóng 100% thậm chí sẽ không đủ: bạn sẽ cần kiểm tra hệ thống kỹ lưỡng cũng như bởi các kỹ sư kiểm tra được đào tạo. Nó có liên quan đến các hệ thống tài chính không? Trong trường hợp đó, bạn chắc chắn nên làm một kiểm toán an ninh quá. bất kỳ% bảo hiểm nào không bằng "hoàn thành". –

+0

@Robert P - Tôi không cố gắng bảo hiểm 100% - Tôi đang cố gắng tìm hiểu xem tôi có thiếu kiểm tra trên kết nối DBI-> của mình hay không. Kể từ khi tôi mới đến Devel :: Cover, tôi nghĩ rằng nó là tốt để biết tại sao mã của tôi không được bảo hiểm 100%. Tôi đã đọc cả hai blog mà bdfoy liên kết bên dưới và biết rằng tôi không cần bảo hiểm 100%. Cũng giống như Perl :: Phê bình - đi qua nhà phê bình mà không có bất kỳ cảnh báo nào là không đủ. – BrianH

Trả lời

9

Ngoài ra, đừng quá hung hăng về phạm vi kiểm tra 100%. Mục đích là để kiểm tra đầy đủ ứng dụng của bạn, không nhận được điểm số hoàn hảo trong Devel :: Cover. Xem bài viết của Ovid về đề tài này:

Trong trường hợp của bạn, có vẻ như bạn không bao gồm tất cả các chi nhánh, do đó bạn không nhận được điểm số hoàn hảo. Bạn cần kiểm tra thực hiện cả hai mặt của || đó. Bạn đang nhận được 33% phần trăm bảo hiểm bởi vì bạn chỉ xử lý một phần ba các trường hợp cho dòng đó. Báo cáo HTML từ Devel :: Cover hiển thị cho bạn bảng sự thật và những trường hợp bạn đang thiếu.

Bảng chân lý hiển thị cho bạn các trạng thái có thể có mà bạn phải bao gồm cho phân nhánh. A 1 hiển thị cho bạn điều kiện đúng, 0 hiển thị cho bạn điều kiện sai và X hiển thị cho bạn điều kiện mà bạn sẽ không đạt được. Bạn phải kiểm tra tất cả các kết hợp có thể thực thi. Kể từ khi || là một nhà điều hành ngắn mạch, bạn không cần phải kiểm tra điều kiện khi một trong số họ đi:

0 || 1  connect to database fails and croak succeeds 
0 || 0  connect to database fails and croak fails (unlikely) 
1 || X  connect to database succeeds, so short circuit 

Đây là một chút không liên quan đến vấn đề cụ thể của bạn, nhưng tôi thấy nó đi lên thường trong các các vấn đề. Mặc dù Effective Perl Programming là một tháng để tránh bị đánh giá, Josh McAdams đã dành khá nhiều thời gian nói về việc tiêm phụ thuộc vào Perl. Nếu bạn gặp khó khăn khi kiểm tra mã của mình, bạn thường gặp phải vấn đề về thiết kế. Ví dụ, nếu bạn đang tạo các đối tượng cơ sở dữ liệu trong các chương trình con, bạn sẽ tự vẽ mình vào một góc. Đó là lý do tại sao nó có thể khó kiểm tra. Điều này có thể không phải là vấn đề trong trường hợp của bạn, nhưng đó là một cái gì đó để suy nghĩ về.

+0

Tôi nghĩ điểm chính của Ovid là phạm vi kiểm tra 100% không đồng nghĩa với "không có lỗi", trái với việc từ chối ý tưởng phủ sóng 100%. "Nếu nó không được bảo hiểm, nó bị hỏng. Mỗi. Đơn. Thời gian." – DVK

+0

Thực ra đó là điểm của Ovid. Đó là lý do tại sao tôi nói về cơ bản điều tương tự trong câu thứ hai của tôi. –

+0

Yep - 2 bài đăng trên blog đó thực sự là điều khiến tôi nhìn vào Devel :: Cover. Tôi không thực sự cố gắng để có được 100% thử nghiệm bảo hiểm - Tôi đã tò mò hơn nếu tôi bị mất một thử nghiệm trong trường hợp cụ thể này mà tôi nên được thử nghiệm. Và lời khuyên tốt về việc có mã kiểm tra thời gian khó. Trong trường hợp này, nó là một thử nghiệm đã được viết. Tôi muốn xem tôi đã vượt qua Devel :: Cover tốt đến mức nào và đã bị mắc kẹt trong kết nối DBI->. Cảm ơn lời khuyên! – BrianH

5

Bạn phải giả lập thư viện DBI (hoặc bất kỳ phụ thuộc bên ngoài nào khác) để bao gồm đầy đủ các bài kiểm tra đơn vị của bạn.

Bạn có thể sử dụng Test :: MockObject hoặc bất kỳ phương thức nhạo báng nào khác (ví dụ: công ty chúng tôi đã phát triển thư viện mô phỏng Perl rất mạnh mẽ của riêng mình).

Ngoài ra, hãy xem this article cụ thể về mô phỏng DBI.

Ngoài ra, hãy đảm bảo bạn đang sử dụng phiên bản Devel :: Cover mới nhất. Tôi đã từng trải qua 3 ngày đấu tranh với một bài kiểm tra đơn vị cho đến khi nó phát hiện ra tôi rằng lỗi không có trong mã của tôi, và không phải trong bài kiểm tra đơn vị của tôi, nhưng trong phiên bản cũ hơn của Devel :: Cover my company đã cài đặt. Nó theo nghĩa đen bỏ qua các đường dẫn mã nhất định trong các trường hợp "A || B".

+0

DBD :: Mock khá tiện dụng cho việc này. http://search.cpan.org/perldoc?DBD::Mock – daotoad

+0

LOL thời gian tốt daotoad - Tôi chỉ cập nhật với một liên kết đề cập đến DBD :: Mock 1 giây trước :) – DVK

+0

Vì vậy, bìa là cụ thể tìm kiếm cho tôi để giả cơ sở dữ liệu của tôi và thiết lập kết nối giả, mặc dù tôi đã kết nối thành công và hủy thành công? Tôi hơi quen thuộc với Test :: MockObject, nhưng không biết về DBD :: Mock. Tôi sẽ phải xem xét thêm. – BrianH

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