2010-02-15 7 views
5

Tôi muốn bắt đầu thực hiện nghiêm túc Phát triển theo hướng thử nghiệm. Tuy nhiên, tôi đã tự hỏi có bao nhiêu tôi nên thử nghiệm phương pháp được tạo ra bởi Moose và MooseX :: FollowPBP. Ví dụ, tôi có lớp sau đây:Tôi cần bao nhiêu để thử nghiệm các phương thức Moose- và MooseX :: FollowPBP-generated?

package Neu::Series; 
use Moose; 
use MooseX::FollowPBP; 

use File::Find::Wanted; 

has 'file_regex' => (
    isa=>'RegexpRef', 
    is=>'rw', 
    default => sub{ 
       qr{ 
        [A-Z]  #Uppercase letter 
        [a-zA-Z]* #any letter, any number of times 
        [-]   #dash 
        (   #open capturing parenthesis 
        [0-9] 
        [0-9] 
        [0-9] 
        [0-9] 
        [a-zA-Z]? #any letter, optional 
        )   #close capturing parenthesis 
       }xms; 
      }, 
); 


has 'top_dir' => (
    isa=>'Str', 
    is=>'rw', 
); 


has 'access' =>(
    isa=>'Neu::Access', 
    is=>'ro', 
    required=>1, 

); 

1; 

kịch bản thử nghiệm hiện tại của tôi là:

use strict; 
use warnings; 
use Test::More tests => 8; 
use Neu::Access; 

BEGIN{ use_ok('Neu::Series'); } 

can_ok('Neu::Series', 'new'); 
can_ok('Neu::Series', 'set_file_regex'); 
can_ok('Neu::Series', 'get_file_regex'); 
can_ok('Neu::Series', 'set_top_dir'); 
can_ok('Neu::Series', 'get_top_dir'); 
can_ok('Neu::Series', 'get_access'); 

my $access = Neu::Access->new(dsn => 'test'); 
my $series_worker = Neu::Series->new(access => $access); 

isa_ok($series_worker, 'Neu::Series'); 

là thử nghiệm đủ hoặc quá nhiều này? (Đó là, bên cạnh các thử nghiệm rõ ràng còn thiếu cho regex).

Tôi nghĩ rằng tôi đã thấy một trang web hoặc một bài đăng khác về điều này ở đâu đó, nhưng tôi đã không thể tìm thấy nó ngay hôm nay.

Trả lời

1

Tôi muốn tập trung vào thử nghiệm đặc điểm kỹ thuật của mình. Tôi đã nói với Moose những gì tôi muốn nó làm một cách chính xác?

Để kết thúc này, tôi muốn bắt đầu với các bài kiểm tra sau:

  • Xác minh rằng đọc/ghi thuộc tính có cả một accessor và mutator.
  • Xác minh rằng các thuộc tính chỉ đọc có trình truy cập và không có trình tắt.
  • Kiểm tra mọi ràng buộc và cưỡng chế kiểu. Xác minh rằng chỉ có thể đặt giá trị chấp nhận được. Nếu thuộc tính sIf bạn mong đợi VII để được xem là Str và bị ép buộc thành Int7, hãy thử nghiệm.
+0

Cảm ơn câu trả lời của bạn. Bạn nói đúng là tôi nên kiểm tra * mọi thứ * mà tôi có thể làm sai bản thân mình. –

2

Kiểm tra xem tất cả các trình truy cập đã được tạo chính xác chưa ... tuy nhiên có những thứ khác bạn có thể thử nghiệm ở mức cao hơn một chút, ví dụ: tại sao không kiểm tra các thuộc tính được tạo đúng cách?

use Test::Deep; 
my @attrs = Neu::Series->meta->get_all_attributes; 
cmp_deeply([ map { $_->name } @attrs ], superbagof(qw(file_regex top_dir access))); 
+1

Cảm ơn bạn đã giới thiệu cho tôi bài kiểm tra 'Deep :: Deep'! Sau khi đọc câu trả lời của bạn, tôi đã đi xem tài liệu và tôi thực sự ấn tượng với nó. Tôi cũng ấn tượng rằng 'Test :: Deep :: NoTest' sẽ cho phép bạn thực hiện tất cả các so sánh giống nhau trong một tình huống không kiểm tra. –

+1

Tôi thích ý tưởng của bạn về truy vấn lớp meta cho mục đích thử nghiệm. Nó cho tôi tạm dừng khi tôi nghĩ rằng điều này làm cho các bài kiểm tra tự phụ thuộc vào Moose, điều gì sẽ xảy ra nếu tôi chọn từ bỏ Moose cho dự án của tôi (cơ hội béo đó)? Có tốt hơn để có các thử nghiệm hộp đen xác minh một phương pháp cụ thể có mặt và hoạt động đúng (với chi phí thử nghiệm phức tạp hơn) hay tốt hơn là sử dụng thông tin lớp meta để xem xét lớp học và xác minh trực tiếp đặc điểm kỹ thuật? – daotoad

+1

@daotoad: Tôi đoán đó là câu hỏi liệu bạn có nghĩ rằng bạn có thể di chuyển ra khỏi Moose hay không và bạn tin tưởng bao nhiêu để mỗi bản phát hành Moose được kiểm tra kỹ lưỡng. Nó khá phổ biến cho các phép tái cấu trúc khác nhau để đòi hỏi phải thay đổi các bài kiểm tra đơn vị, và vì quá trình cài đặt Moose khá vững chắc, IMHO tôi chỉ kiểm tra sự tồn tại của các thuộc tính và tiếp tục kiểm tra việc thực hiện thực tế lớp của bạn (logic ứng dụng không liên quan đến Moose). Tôi sử dụng các thử nghiệm meta-cụ thể trong công việc $ của tôi khi thử nghiệm thành phần vai trò phức tạp, ở đó có thể thiếu thuộc tính. – Ether

5

Thực sự không có điểm nào trong việc kiểm tra rằng trình truy cập đã được tạo chính xác. Nếu chúng là không phải, bạn sẽ tìm thấy rất nhanh chóng, bởi vì bất kỳ thử nghiệm thực tế nào bạn viết đều sẽ không thành công.

Bản thân Moose kiểm tra rằng các trình truy cập được tạo đúng cách, các lớp Moose-using có một hàm tạo, v.v. Một trong những điểm sử dụng phụ thuộc là để bạn có thể tập trung vào viết và thử nghiệm ứng dụng của mình, chứ không phải mã trợ giúp.

Tôi đồng ý với daotoad, đó có thể là các ràng buộc thử nghiệm có giá trị và cưỡng chế mà bạn tự viết.

+0

Thật tuyệt vời! Nhờ bạn và phần còn lại của đội Moose. –

+0

Tôi đồng ý rằng không có điểm nào trong các bài kiểm tra viết tóm tắt lại bài kiểm tra toàn diện của Moose, nhưng tôi đứng trước đề xuất của tôi để xác minh người truy cập và người đột biến. Tôi tin tưởng Moose làm những gì tôi bảo nó làm - Moose luôn làm chính xác những gì tôi viết. Tuy nhiên, tôi không tin tưởng bản thân mình để nói với Moose những gì tôi muốn nó làm. Thật dễ dàng để đặt 'rw' vào một thuộc tính khi bạn thực sự muốn' ro'. Các xét nghiệm này nên đơn giản nhất có thể - chúng kiểm tra thông số, chứ không phải chức năng. – daotoad

+2

Tôi đã viết một [blog entry] (http://blog.urth.org/2010/02/the-purpose-of-automated-tests.html) về chủ đề này. –

1

Cảm ơn bạn Dave, daotoad, Ether, Elliot và brian. Từ đọc câu trả lời, nhận xét và blog của bạn, có vẻ như có hai điểm nổi bật:

(1) Không cần thử nghiệm để đảm bảo Moose thực hiện thao tác đó. Tôi nghĩ mọi người đều đồng ý vào thời điểm này.

(2) Thử nghiệm Các phương thức do Moose tạo ra phù hợp để thiết lập, thử nghiệm và duy trì giao diện của bạn. Hầu hết đều đồng ý về điểm này.

Một lần nữa, cảm ơn tất cả mọi người đã nhập liệu của bạn.

EDIT:

Đây chỉ là tóm tắt cộng đồng wiki. Vui lòng đọc câu trả lời và nhận xét riêng lẻ.