Tôi đã thử gần đây để rèn luyện bản thân rất nhiều trong các thực hành tốt nhất về kiểm thử đơn vị. Hầu hết nó có ý nghĩa hoàn hảo, nhưng có cái gì đó thường bị bỏ qua và/hoặc giải thích một cách tồi tệ: làm thế nào một đơn vị thử nghiệm các chức năng trang trí?Làm thế nào để kiểm tra đơn vị chức năng trang trí?
Giả sử tôi có mã này:
def stringify(func):
@wraps(func)
def wrapper(*args):
return str(func(*args))
return wrapper
class A(object):
@stringify
def add_numbers(self, a, b):
"""
Returns the sum of `a` and `b` as a string.
"""
return a + b
tôi rõ ràng có thể viết các bài kiểm tra sau:
def test_stringify():
@stringify
def func(x):
return x
assert func(42) == "42"
def test_A_add_numbers():
instance = MagicMock(spec=A)
result = A.add_numbers.__wrapped__(instance, 3, 7)
assert result == 10
này mang lại cho tôi bảo hiểm 100%: Tôi biết rằng bất kỳ chức năng đó được trang trí với stringify()
được kết quả của mình như là một chuỗi, và tôi biết rằng các chức năng A.add_numbers()
undecorated trả về tổng của các đối số của nó. Vì vậy, bằng cách chuyển đổi, phiên bản trang trí của A.add_numbers()
phải trả về tổng số đối số của nó, dưới dạng một chuỗi. Tất cả có vẻ tốt!
Tuy nhiên tôi không hoàn toàn hài lòng với điều này: các bài kiểm tra của tôi, như tôi đã viết chúng vẫn có thể vượt qua nếu tôi sử dụng một trang trí khác (làm điều gì đó khác, nói nhân kết quả bằng 2 thay vì đúc thành str
) . Chức năng của tôi A.add_numbers
sẽ không chính xác nữa nhưng các bài kiểm tra vẫn sẽ vượt qua. Không tuyệt vời.
Tôi có thể kiểm tra phiên bản trang trí A.add_numbers()
nhưng sau đó tôi sẽ vượt qua mọi thứ kể từ khi trang trí của tôi đã được kiểm tra đơn vị.
Có vẻ như tôi đang thiếu thứ gì đó ở đây. Một chiến lược tốt để kiểm tra đơn vị chức năng trang trí là gì?
Tôi tin rằng bạn đã đọc câu hỏi của mình một chút quá nhanh. Tôi không có ý định viết các bài kiểm tra chức năng mà là các bài kiểm tra đơn vị. – ereOn
Thực tế là 'add_numbers' thực sự là một chức năng khác được trang trí bởi' stringify' là một chi tiết thực hiện. Kiểm tra rằng 'add_numbers' hoạt động như dự định, và nó sẽ không thành vấn đề nếu bạn sử dụng một trang trí khác (hoặc không có trang trí nào cả). – chepner
@chepner: Bài kiểm tra đơn vị chính xác ở đây để kiểm tra chi tiết triển khai. Một lần nữa, nếu chúng ta đang nói về các bài kiểm tra chức năng/tích hợp, tôi sẽ đồng ý. Đó chỉ là chủ đề ở đây. – ereOn