2013-01-11 36 views
7

Chạy nosetests -s choCó một nhược điểm nào khi sử dụng __init __ (self) thay vì thiết lập (self) cho một lớp kiểm tra mũi?

class TestTemp(): 

    def __init__(self): 
     print '__init__' 
     self.even = 0 

    def setup(self): 
     print '__setup__' 
     self.odd = 1 

    def test_even(self): 
     print 'test_even' 
     even_number = 10 
     assert even_number % 2 == self.even 

    def test_odd(self): 
     print 'test_odd' 
     odd_number = 11 
     assert odd_number % 2 == self.odd 

in ra như sau.

__init__ 
__init__ 
__setup__ 
test_even 
.__setup__ 
test_odd 
. 

Trường hợp thử nghiệm được tạo trước khi chạy thử, trong khi thiết lập chạy ngay trước khi thử nghiệm.

Đối với trường hợp chung, __init__() và thiết lập() hoàn thành điều tương tự, nhưng có nhược điểm khi sử dụng __init__() thay vì thiết lập()? Hoặc sử dụng cả hai?

Trả lời

2

Trong khi __init__ có thể hoạt động thay thế cho setUp, bạn nên gắn thành setUp vì nó là một phần của giao thức được cách điệu để viết kiểm tra. Nó cũng có một đối tác, tearDown, trong đó __init__ không, cũng như các đối tác cấp lớp và mô-đun mà __init__ thì không.

Viết các lớp kiểm tra khác với viết các lớp bình thường, vì vậy bạn nên gắn vào phong cách được sử dụng để viết các lớp thử nghiệm.

+0

Tôi đồng ý rằng nếu không có trường hợp sử dụng cho một lớp thử nghiệm '__init__', bằng cách sử dụng giao thức được cách điệu,' setup', là một lựa chọn tốt hơn cho tính nhất quán. –

2

Có, bạn có nghĩa vụ phải tạo một phương tiện chặn sạch cho các bài kiểm tra và giữ các bài kiểm tra cá nhân của bạn được phân lập.

Có vẻ như các phiên bản thử nghiệm (một cho mỗi thử nghiệm) được tạo thành một lô, trong khi setup được gọi ngay trước mỗi lần kiểm tra. Nếu thiết lập của bạn cần đặt lại trạng thái bên ngoài, bạn sẽ cần thực hiện điều này trong setup; nếu bạn đã làm điều này trong __init__ các thử nghiệm riêng lẻ có thể làm hỏng trạng thái bên ngoài đó cho phần còn lại của chạy thử nghiệm.

+2

Điều này không đúng: trường hợp thử nghiệm mới được tạo cho mỗi thử nghiệm, vì vậy '__init__' được gọi thường xuyên là' setUp'. –

+0

@NedBatchelder: Vì vậy, nó được; cùng một tiền đề vẫn còn áp dụng, chỉ cho nhà nước bên ngoài sau đó .. Cảm ơn cho người đứng đầu! –