__init__ cho unittest.TestCase


122

Tôi muốn thêm một số thứ vào những gì unittest.TestCaselớp thực hiện khi được khởi tạo nhưng tôi không thể tìm ra cách thực hiện.

Ngay bây giờ tôi đang làm điều này:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

Tôi muốn tất cả các sơ khai chỉ được tạo một lần cho toàn bộ bộ thử nghiệm này. Tôi không thể sử dụng setUpClass()vì tôi đang làm việc trên Python 2.4 (tôi cũng không thể làm điều đó hoạt động trên python 2.7).

Tôi làm gì sai ở đây?

Tôi gặp lỗi này:

 `TypeError: __init__() takes 1 argument (2 given)` 

... và các lỗi khác khi tôi chuyển tất cả mã sơ khai vào __init__khi tôi chạy nó bằng lệnh python -m unittest -v test.


@Neeraj Tôi nghĩ câu hỏi của tôi có trước câu hỏi đó?
ffledgling

@Abhijeet Câu hỏi này được hỏi vào năm 2013, câu hỏi mà bạn liên kết đến đã được hỏi vào năm 2016 và có ít câu trả lời và diễn ngôn hơn, có lẽ bạn nên đánh dấu câu hỏi kia là trùng lặp để thay thế? Câu trả lời có Python 3 liên quan và câu hỏi này nói về Python 2.
ffledgling

xin lỗi về điều đó xấu của tôi.
Abhijeet

Câu trả lời:


166

Thử cái này:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

Bạn đang ghi đè các TestCase' __init__, vì vậy bạn có thể muốn để lớp cơ sở xử lý các đối số cho bạn.


+1 Mặc dù vậy, tôi sẽ khởi tạo lớp cơ sở trước khi gọi bất kỳ phương thức đối tượng nào.
Joachim Isaksson

Điều này không hiệu quả với tôi. Nội dung bên trong gen_stub không được thực thi. Infact có vẻ như gen_stub hoàn toàn không được gọi ... Tôi có thể nói vì self.tempdir được cho là tồn tại, không thể được truy cập bằng các phương thức khác của lớp. Tôi nhận được một AttributeError: đối tượng 'TestingClass' không có thuộc tính 'tempdir'
ffledgling

22
bạn không nên gọi điều này setUpthay vì ghi đè __init__?
karthikr

2
@karthikr Tôi muốn tạo sơ khai một lần cho tất cả các bài kiểm tra hơn là tạo lại chúng cho mỗi lần kiểm tra. Một số bản gốc thậm chí sẽ không được sử dụng trong một số bài kiểm tra. Tôi sẽ sử dụng setUpClass, nhưng tôi không nghĩ rằng python 2.4 hỗ trợ nó.
ffledgling

2
Bạn cũng có thể rõ ràng hơn một chút trong trường hợp này (điều này giúp dễ đọc theo quan điểm của tôi) và sử dụng: unittest.TestCase.__init__(self,*args,**kwargs)thay vìsuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo 14/02/18

22

Chỉ muốn thêm một số giải thích rõ ràng về việc ghi đè hàm init của

unittest.TestCase

Hàm sẽ được gọi trước mỗi phương thức trong lớp thử nghiệm của bạn. Hãy lưu ý rằng nếu bạn muốn thêm một số tính toán đắt tiền mà nên được thực hiện một lần trước khi chạy tất cả các phương pháp thử lòng sử dụng SetUpClass classmethod

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

Hàm này sẽ được gọi một lần trước tất cả các phương thức kiểm tra của lớp. Xem setUpphương thức được gọi trước mỗi phương pháp thử nghiệm.


4

Cài đặt unittest2 và sử dụng unittest của gói đó.

import unittest2 

và sau đó sử dụng lớp setupModule / ráchDownModule hoặc setupClass / xéDown cho logic khởi tạo đặc biệt

Thông tin thêm: http://www.voidspace.org.uk/python/articles/unittest2.shtml

Ngoài ra, rất có thể bạn đang tạo một thử nghiệm tích hợp nhiều hơn một thử nghiệm tích hợp nhất. Chọn một tên hay cho các Bài kiểm tra để phân biệt chúng hoặc đặt trong một mô-đun vùng chứa khác.


Cảm ơn vì liên kết tài liệu.
Chris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.