2012-08-17 56 views
13

Tôi đang thử nghiệm các ứng dụng web được viết bằng python.Nosetests Python bỏ qua một số thử nghiệm

Giả sử tôi có 5 thử nghiệm trong mô-đun test_login.py của mình.

Mỗi thử nghiệm đơn lẻ là một Lớp.

Thường có một bài kiểm tra cơ sở mở rộng lớp TestFlow, lớp học thử nghiệm được xác định trước của chúng tôi.

Và sau đó các thử nghiệm khác trong mô-đun này mở rộng kiểm tra cơ sở đó.

Ví dụ:

#The base test 

TestLogin(TestFlow): 
    #do login_test_stuff_here 

#Another test in the same module 

TestAccountDetails(TestLogin) 
    #do account_details_test_stuff_here 

... 

Nó thực sự khá tiện dụng, vì để kiểm tra ví dụ AccountDetails người dùng phải đăng nhập, vì vậy tôi có thể kế thừa từ kiểm tra TestLogin và tôi đã sẵn sàng để thử nghiệm chức năng khác là người dùng đã đăng nhập.

Tất cả các thử nghiệm đều nằm trong thư mục Project/project/tests.

Chúng tôi sử dụng nosetests có tùy chọn - with-pylons để chạy thử nghiệm.

Và câu hỏi của tôi là nếu có cách đánh dấu một số TestClass nhất định là "Không thử nghiệm thử nghiệm này".

Bởi vì tôi không muốn lãng phí thời gian để thực hiện các "kiểm tra cơ bản" này trực tiếp, bởi vì chúng sẽ được thực hiện bởi các thử nghiệm khác xuất phát từ chúng.

Sẽ có thể có âm của các thử nghiệm này và tôi muốn lưu từng giây một khi có thể.

Tôi đã tìm thấy thứ gì đó như Skip, SkipTest hoặc @nottest, nhưng chỉ làm việc cho test_methods trong một TestClass ceratin, vì vậy tôi không nghĩ rằng nó sẽ hoạt động ở đây, tôi có một lớp duy nhất cho mỗi trường hợp thử nghiệm.

Trả lời

2

http://nose.readthedocs.org/en/latest/writing_tests.html

kiểm tra Viết

Như với py.test, kiểm tra mũi không cần phải là lớp con của unittest.TestCase. Bất kỳ hàm hoặc lớp nào phù hợp với cụm từ thông dụng 01Mcấu hình testMatch được định cấu hình ((?:^| [\ B _ \ .-]) [Tt] est) theo mặc định - nghĩa là, có kiểm tra hoặc Thử nghiệm tại một ranh giới từ hoặc theo sau - hoặc _) và sống trong mô-đun cũng khớp với biểu thức đó sẽ được chạy dưới dạng một thử nghiệm. Vì lợi ích của khả năng tương thích với các trường hợp thử nghiệm di sản không nhất thiết, mũi cũng sẽ tải các thử nghiệm từ các lớp con không liên quan.TestCase giống như unittest. Giống như py.test, mũi chạy các thử nghiệm chức năng theo thứ tự mà chúng xuất hiện trong tệp mô-đun. TestCase-based tests và các lớp kiểm tra khác được chạy theo thứ tự bảng chữ cái.

lưu ý regex và quy tắc ở trên. đặt tên cho các hàm/phương thức/lớp của bạn để không khớp với regex và chúng sẽ không chạy.

điều đó đang được nói, tôi không khuyên bạn nên đề xuất của bạn về kế thừa chuỗi để thử nghiệm. đó là một công thức cho sự thất vọng và lộn xộn.

bạn có thể tốt hơn khi tạo lớp mixin hoặc xác định lớp cơ sở không có bất kỳ kiểm tra thực tế nào - nhưng có nhiều chức năng trợ giúp kế thừa các lớp có thể gọi và sử dụng như của riêng chúng.

nếu bạn xem xét các thử nghiệm của các gói phổ biến hơn, hầu như tất cả đều sử dụng phương pháp đó.

+0

Lưu ý rằng regex đối sánh không phải là cổng duy nhất để đưa vào - * mũi cũng sẽ tải các thử nghiệm từ các lớp con không liên kết.TestCase *. Nó xuất hiện để làm điều này cho bất cứ điều gì mà nó nhập khẩu là tốt. Tôi có một thử nghiệm có tên 'FooMixin' trong một mô-đun có tên' foo_helpers.py' đang được coi là một thử nghiệm đơn giản bởi vì nó có nguồn gốc từ 'unittest.TestCase'. –

12

nosetests Form nó có thể được thực hiện như dưới đây bằng cách xác định các thuộc tính http://nose.readthedocs.org/en/latest/plugins/attrib.html

Thông thường khi kiểm tra bạn sẽ muốn chọn các xét nghiệm dựa trên các tiêu chí chứ không phải chỉ đơn giản bằng tên tập tin. Ví dụ, bạn có thể chạy tất cả các bài kiểm tra ngoại trừ các bài kiểm tra chậm. Bạn có thể thực hiện việc này bằng plugin trình chọn thuộc tính bằng cách đặt thuộc tính trên phương thức thử nghiệm của mình. Dưới đây là một ví dụ:

def test_big_download(): 
    import urllib 
    # commence slowness... 

test_big_download.slow = 1 

Khi bạn đã gán một thuộc tính chậm = 1 bạn có thể loại trừ rằng thử nghiệm và tất cả các xét nghiệm khác có thuộc tính chậm bằng cách chạy

$ nosetests -a '!slow' 
2

Bạn thực sự có thể sử dụng skiptest cho các lớp học quá.

import unittest 

@unittest.skip("Class disabled") 
class TestLogin(TestFlow): 
    ... 
+0

Lưu ý rằng trên Python <= 2.6, bạn cần cài đặt unittest2 để làm việc này. – gaborous

+1

Điều đó sẽ không hoạt động đối với trường hợp sử dụng được cung cấp. Thêm trang trí bỏ qua vào lớp cơ sở sẽ khiến tất cả các lớp con cũng bị bỏ qua. Ngay cả khi bạn đã sử dụng '@ unittest.skipIf (True," lớp cơ sở ")' trên lớp cơ sở và '@ unittest.skipIf (False," ")' trên các lớp con, các lớp con vẫn bị bỏ qua –