Không có gì lạ khi có mã thiết lập không thể chạy dưới dạng phương thức lớp. Một ví dụ đáng chú ý là Django test client: bạn có thể không muốn sử dụng lại cùng một cá thể ứng dụng trên các thử nghiệm mà nếu không chia sẻ nhiều dữ liệu giống nhau, và thực sự, các cá thể khách hàng sẽ tự động được bao gồm trong các lớp con củacủa Django là created per test method thay vì cho toàn bộ lớp . Giả sử bạn đã có một bài kiểm tra từ 1,8 thế giới trước Django với một phương pháp setUp
như thế này:
def setUp(self):
self.the_user = f.UserFactory.create()
self.the_post = f.PostFactory.create(author=self.the_user)
self.client.login(
username=self.the_user.username, password=TEST_PASSWORD
)
# ... &c.
Bạn có thể bị cám dỗ để hiện đại hóa các trường hợp thử nghiệm bằng cách thay đổi setUp
để setUpTestData
, tát một decorator @classmethod
trên đầu trang, và thay đổi tất cả số self
s đến cls
. Nhưng điều đó sẽ thất bại với AttributeError: type object 'MyTestCase' has no attribute 'client'
! Thay vào đó, bạn nên sử dụng setUpTestData
cho dữ liệu được chia sẻ và setUp
cho khách hàng mỗi thử nghiệm phương pháp:
@classmethod
def setUpTestData(cls):
cls.the_user = f.UserFactory.create()
cls.the_post = f.PostFactory.create(author=cls.the_user)
# ... &c.
def setUp(self):
self.client.login(
username=self.the_user.username, password=TEST_PASSWORD
)
Nguồn
2015-04-04 03:56:28
Đáng giá thêm một số chi tiết khác từ phương pháp này https://makina-corpus.com/blog/metier/2015/how-to-optimize-django-unit-tests-with-setuptestdata. Nếu bạn có dữ liệu thử nghiệm thay đổi theo từng thử nghiệm, bạn vẫn có thể tạo các mô hình có thể thay đổi trong 'setUpTestData', miễn là bạn thực hiện' self.model.refresh_from_db() 'trong' setUp' của bạn. Các thay đổi từ một TC được cuộn lại, nhưng không có bước thủ công đó, tệp self.model sẽ tham chiếu đến dữ liệu của lần chạy trước đó. Với bước thiết lập, bạn làm một đọc cho mỗi trường hợp thử nghiệm, nhưng thường là nhanh hơn so với làm một viết cho mỗi trường hợp thử nghiệm. – Symmetric