Tôi nghĩ rằng tôi sẽ thêm bốn trường hợp nữa, trong đó Debug.Assert có thể là lựa chọn đúng đắn.
1) Một cái gì đó tôi chưa thấy được đề cập ở đây là phạm vi bảo hiểm khái niệm bổ sung Các xác nhận có thể cung cấp trong quá trình thử nghiệm tự động . Một ví dụ đơn giản:
Khi một số người gọi cấp cao hơn được sửa đổi bởi một tác giả tin rằng họ đã mở rộng phạm vi của mã để xử lý các kịch bản bổ sung, lý tưởng nhất là (!), Họ sẽ viết các bài kiểm tra đơn vị để bao quát điều kiện mới này. Sau đó, có thể là mã tích hợp đầy đủ có vẻ hoạt động tốt.
Tuy nhiên, thực sự một lỗ hổng tinh tế đã được giới thiệu, nhưng không được phát hiện trong kết quả thử nghiệm. Callee đã trở nên không xác định trong trường hợp này và chỉ xảy ra để cung cấp kết quả mong đợi. Hoặc có lẽ nó đã mang lại một lỗi làm tròn mà không được chú ý. Hoặc gây ra một lỗi đã được bù bằng nhau ở nơi khác. Hoặc được cấp không chỉ quyền truy cập được yêu cầu mà còn các đặc quyền bổ sung không nên được cấp. Vân vân.
Tại thời điểm này, các câu lệnh Debug.Assert () có trong callee kết hợp với trường hợp mới (hoặc trường hợp cạnh) được điều khiển bởi các bài kiểm tra đơn vị có thể cung cấp thông báo vô giá trong quá trình kiểm tra rằng các giả định của tác giả ban đầu đã bị vô hiệu và mã không nên được phát hành mà không cần xem xét thêm. Các khẳng định với các bài kiểm tra đơn vị là các đối tác hoàn hảo.
2) Ngoài ra, một số bài kiểm tra rất đơn giản để viết, nhưng chi phí cao và không cần thiết với các giả định ban đầu . Ví dụ:
Nếu một đối tượng chỉ có thể được truy cập từ một điểm nhập được bảo mật nhất định, có nên thực hiện một truy vấn bổ sung cho cơ sở dữ liệu quyền mạng từ mọi phương thức đối tượng để đảm bảo người gọi có quyền? Chắc chắn là không. Có lẽ giải pháp lý tưởng bao gồm bộ nhớ đệm hoặc một số tính năng mở rộng khác, nhưng thiết kế không yêu cầu nó. Một Debug.Assert () sẽ ngay lập tức hiển thị khi đối tượng đã được gắn vào một điểm nhập không an toàn.
3) Tiếp theo, trong một số trường hợp, sản phẩm của bạn có thể không có tương tác chẩn đoán hữu ích cho tất cả hoặc một phần hoạt động của sản phẩm khi được triển khai ở chế độ phát hành . Ví dụ:
Giả sử nó là một thiết bị thời gian thực nhúng. Ném ngoại lệ và khởi động lại khi nó gặp một gói không đúng định dạng là phản tác dụng. Thay vào đó, thiết bị có thể được hưởng lợi từ hoạt động nỗ lực tốt nhất, thậm chí đến mức gây ra tiếng ồn trong đầu ra của nó. Nó cũng có thể không có giao diện người, thiết bị ghi nhật ký hoặc thậm chí con người có thể truy cập vật lý khi được triển khai ở chế độ phát hành và nhận thức về lỗi được cung cấp tốt nhất bằng cách đánh giá cùng một đầu ra. Trong trường hợp này, các xác nhận tự do và thử nghiệm trước khi phát hành kỹ lưỡng có giá trị hơn các trường hợp ngoại lệ.
4) Cuối cùng, một số thử nghiệm không thành công chỉ vì callee được coi là cực kỳ đáng tin cậy . Trong hầu hết các trường hợp, mã có thể tái sử dụng càng nhiều, càng có nhiều nỗ lực để làm cho nó đáng tin cậy. Do đó, thông thường là Ngoại lệ đối với các tham số không mong muốn từ người gọi, nhưng Khẳng định cho kết quả không mong muốn từ callees. Ví dụ:
Nếu một String.Find
hoạt động cốt lõi nói rằng nó sẽ trả về -1
khi không tìm thấy tiêu chí tìm kiếm, bạn có thể thực hiện một cách an toàn một thao tác thay vì ba. Tuy nhiên, nếu nó thực sự trở lại -2
, bạn có thể không có quá trình hành động hợp lý. Sẽ không có ích khi thay thế phép tính đơn giản hơn bằng phép tính riêng cho một -1
giá trị và không hợp lý trong hầu hết các môi trường phát hành để xả mã của bạn bằng các kiểm tra đảm bảo các thư viện lõi hoạt động như mong đợi. Trong trường hợp này Khẳng định là lý tưởng.