2011-12-13 29 views
5

Tôi muốn thêm một bài kiểm tra vào bản phân phối Perl của mình yêu cầu một mô-đun Foo, nhưng bản phân phối của tôi không yêu cầu Foo; chỉ thử nghiệm yêu cầu Foo. Vì vậy, tôi không muốn thêm mô-đun vào các phụ thuộc, nhưng thay vào đó tôi chỉ muốn bỏ qua các bài kiểm tra yêu cầu Foo nếu Foo không có sẵn tại thời gian xây dựng.Làm cách nào để chạy thử nghiệm trong bộ thử nghiệm của mô-đun Perl của tôi chỉ khi mô-đun được yêu cầu được cài đặt?

Cách thích hợp để thực hiện việc này là gì? Tôi có nên chỉ cần kiểm tra Foo của tôi trong một khối eval cùng với use Foo;, để các thử nghiệm sẽ không chạy nếu tải Foo không thành công? Hoặc là có một cách thanh lịch hơn để làm điều đó?

+0

Bạn đang sử dụng mô-đun thử nghiệm nào? – Pradeep

+0

Tôi đang sử dụng Kiểm tra :: Thêm, nhưng vui lòng đề xuất một số khác nếu tính năng này có tính năng này. –

+0

Nhìn vào các câu trả lời dưới đây nhưng đọc tài liệu cũ của mô-đun bạn đang sử dụng phải là tùy chọn đầu tiên :-) – Matteo

Trả lời

6

Test :: More có một tùy chọn để bỏ qua nếu một số điều kiện là không hài lòng, xem dưới đây

SKIP: { 
    eval { require Foo }; 

    skip "Foo not installed", 2 if [email protected]; 

    ## do something if Foo is installed 
}; 
+0

Đẹp và đơn giản. Bây giờ tôi biết về chức năng "bỏ qua" trong bài kiểm tra :: Hơn nữa, tôi đã tìm thấy phần về nó trong tài liệu. Cảm ơn! –

+0

Bạn được chào đón :-) – Pradeep

+2

'eval {yêu cầu Foo} hoặc bỏ qua ...;' –

8

Nếu tất cả các bài kiểm tra đòi hỏi Some::Module đang ở trong một tập tin duy nhất, thật dễ dàng để làm:

use Test::More; 

BEGIN { 
    eval { 
     require Some::Module; 
     1; 
    } or do { 
     plan skip_all => "Some::Module is not available"; 
    }; 
} 

(Nếu bạn đang sử dụng một số thử nghiệm như use Test::More tests => 42; sau đó bạn cũng cần phải sắp xếp để làm plan tests => 42; nếu yêu cầu không thành công.)

Nếu họ là một số nhỏ hơn của các bài kiểm tra trong một file có chứa những thứ khác, sau đó bạn có thể làm một cái gì đó như:

our $HAVE_SOME_MODULE = 0; 

BEGIN { 
    eval { 
     require Some::Module; 
     $HAVE_SOME_MODULE = 1; 
    }; 
} 

# ... some other tests here 

SKIP: { 
    skip "Some::Module is not available", $num_skipped unless $HAVE_SOME_MODULE; 
    # ... tests using Some::Module here 
} 
2

Từ các tài liệu của Test::More:

SKIP: { 
    eval { require HTML::Lint }; 
    skip "HTML::Lint not installed", 2 if [email protected]; 
    my $lint = new HTML::Lint; 
    isa_ok($lint, "HTML::Lint"); 
    $lint->parse($html); 
    is($lint->errors, 0, "No errors found in HTML"); 
} 
2

Ngoài ra, declare your test step requirement or recommendation (có sự khác biệt) trong tệp meta distro. Điều này sẽ được chọn bởi một khách hàng thực hiện cài đặt. Tại thời điểm cài đặt, người dùng có thể quyết định có nên cài đặt vĩnh viễn một yêu cầu như vậy hay loại bỏ nó vì nó chỉ được sử dụng để thử nghiệm.

+0

Có vẻ như phương pháp 'Test :: More :: skip' và câu trả lời của bạn là bổ sung. Chức năng 'bỏ qua 'cho phép tôi bỏ qua các bài kiểm tra yêu cầu một mô-đun không có sẵn, trong khi câu trả lời của bạn cho phép tôi đề nghị rằng khách hàng cài đặt mô-đun mà không làm cho nó trở thành một phụ thuộc khó. Nếu khách hàng đang cài đặt phân phối của tôi quyết định không cài đặt phụ thuộc kiểm tra tùy chọn, thì nó sẽ bỏ qua * tất cả * các thử nghiệm? Hay bằng cách nào đó nó sẽ biết những bài kiểm tra nào phụ thuộc vào mô-đun tùy chọn đó và tự động bỏ qua những phần đó? –

+0

Hoặc, để đơn giản hơn, việc khai báo phụ thuộc tùy chọn chắc chắn là điều tôi sẽ làm, nhưng tôi không thấy nó giải phóng tôi khỏi nghĩa vụ xử lý trường hợp mô-đun tùy chọn đó chưa được cài đặt. –

+0

Không hoàn toàn, nếu đó là yêu cầu kiểm tra thì nó * sẽ * có sẵn. Nhưng bây giờ tôi nhận ra đó không phải là câu hỏi, tôi hiểu sai ý bạn là gì với tùy chọn. Bạn có quyền kiểm tra bỏ qua là cần thiết trong trường hợp đó; Tôi đã chỉnh sửa câu trả lời để làm cho nó như vậy. – daxim

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