EDIT: chuyển sang một ví dụ tốt hơn và làm rõ lý do tại sao đây là một vấn đề thực sự.
Tôi muốn viết các bài kiểm tra đơn vị bằng Python để tiếp tục thực thi khi một xác nhận không thành công, để tôi có thể thấy nhiều lỗi trong một lần kiểm tra. Ví dụ:
class Car(object):
def __init__(self, make, model):
self.make = make
self.model = make # Copy and paste error: should be model.
self.has_seats = True
self.wheel_count = 3 # Typo: should be 4.
class CarTest(unittest.TestCase):
def test_init(self):
make = "Ford"
model = "Model T"
car = Car(make=make, model=model)
self.assertEqual(car.make, make)
self.assertEqual(car.model, model) # Failure!
self.assertTrue(car.has_seats)
self.assertEqual(car.wheel_count, 4) # Failure!
Ở đây, mục đích của bài kiểm tra là để đảm bảo rằng Car's __init__
đặt các trường của nó một cách chính xác. Tôi có thể chia nó thành bốn phương thức (và đó thường là một ý tưởng tuyệt vời), nhưng trong trường hợp này, tôi nghĩ sẽ dễ đọc hơn nếu giữ nó như một phương thức duy nhất kiểm tra một khái niệm duy nhất ("đối tượng được khởi tạo chính xác").
Nếu chúng ta cho rằng tốt nhất ở đây là không chia nhỏ phương pháp, thì tôi gặp một vấn đề mới: Tôi không thể thấy tất cả các lỗi cùng một lúc. Khi tôi sửa model
lỗi và chạy lại kiểm tra thì wheel_count
lỗi xuất hiện. Nó sẽ giúp tôi tiết kiệm thời gian để xem cả hai lỗi khi tôi chạy thử nghiệm lần đầu tiên.
Để so sánh, khung kiểm tra đơn vị C ++ của Google phân biệt giữaEXPECT_*
xác nhận không nghiêm trọng và ASSERT_*
xác nhận nghiêm trọng :
Các khẳng định đi theo từng cặp kiểm tra cùng một điều nhưng có tác động khác nhau đến chức năng hiện tại. Các phiên bản ASSERT_ * tạo ra các lỗi nghiêm trọng khi chúng bị lỗi và hủy bỏ chức năng hiện tại. Phiên bản EXPECT_ * tạo ra lỗi không phải chất béo, không hủy bỏ chức năng hiện tại. EXPECT_ * thường được ưu tiên hơn, vì chúng cho phép nhiều hơn một lỗi được báo cáo trong một bài kiểm tra. Tuy nhiên, bạn nên sử dụng ASSERT_ * nếu việc tiếp tục khi xác nhận được đề cập không thành công là không hợp lý.
Có cách nào để có được EXPECT_*
hành vi giống trong Python unittest
không? Nếu không unittest
, thì có một khung kiểm tra đơn vị Python nào khác hỗ trợ hành vi này không?
Tình cờ, tôi tò mò về việc có bao nhiêu thử nghiệm trong đời thực có thể hưởng lợi từ các xác nhận không gây tử vong, vì vậy tôi đã xem một số ví dụ về mã (đã chỉnh sửa 2014-08-19 để sử dụng mã tìm kiếm thay vì Google Code Search, RIP). Trong số 10 kết quả được chọn ngẫu nhiên từ trang đầu tiên, tất cả đều chứa các thử nghiệm đưa ra nhiều khẳng định độc lập trong cùng một phương pháp thử nghiệm. Tất cả sẽ được hưởng lợi từ các khẳng định không gây tử vong.