Các xác nhận rất hữu ích để cho bạn biết về trạng thái nội bộ của chương trình . Ví dụ: cấu trúc dữ liệu của bạn có trạng thái hợp lệ, ví dụ: Time
cấu trúc dữ liệu sẽ không giữ giá trị của 25:61:61
. Các điều kiện được kiểm tra bởi các khẳng định là:
Điều kiện tiên quyết, đảm bảo rằng người gọi giữ hợp đồng của mình,
Postconditions, đảm bảo rằng callee giữ hợp đồng của nó, và
Các bất biến, đảm bảo rằng cấu trúc dữ liệu luôn giữ một số thuộc tính sau khi hàm trả về. Một bất biến là một điều kiện là điều kiện tiên quyết và hậu điều kiện.
Kiểm tra đơn vị rất hữu ích để cho bạn biết về hành vi bên ngoài của mô-đun . Bạn Stack
có thể có trạng thái nhất quán sau khi push()
phương thức được gọi, nhưng nếu kích thước của ngăn xếp không tăng gấp ba sau khi nó được gọi ba lần, thì đó là một lỗi. (Ví dụ: trường hợp tầm thường trong đó việc push()
triển khai không chính xác chỉ kiểm tra các xác nhận và thoát.)
Nói một cách chính xác, sự khác biệt chính giữa các xác nhận và kiểm tra đơn vị là các kiểm tra đơn vị có dữ liệu kiểm tra (các giá trị để chương trình chạy), trong khi các xác nhận thì không. Đó là, bạn có thể thực hiện các bài kiểm tra đơn vị của mình một cách tự động, trong khi bạn không thể nói tương tự cho các xác nhận. Vì lợi ích của cuộc thảo luận này, tôi đã giả định rằng bạn đang nói về việc thực hiện chương trình trong bối cảnh kiểm tra chức năng bậc cao (thực thi toàn bộ chương trình và không lái các mô-đun như kiểm tra đơn vị). Nếu bạn không nói về kiểm tra chức năng tự động như là phương tiện để "xem đầu vào thực", thì rõ ràng giá trị nằm ở tự động hóa, và do đó, kiểm tra đơn vị sẽ giành chiến thắng. Nếu bạn đang nói về điều này trong bối cảnh kiểm tra chức năng (tự động), thì xem bên dưới.
Có thể có một số chồng chéo trong những gì đang được thử nghiệm. Ví dụ, Stack
postcondition thực sự có thể khẳng định rằng kích thước ngăn xếp tăng thêm một. Nhưng có những giới hạn đối với những gì có thể được thực hiện trong khẳng định đó: Nó cũng nên kiểm tra xem phần tử trên cùng có phải là những gì vừa được thêm vào không?
Đối với cả hai, mục tiêu là tăng chất lượng. Đối với thử nghiệm đơn vị, mục tiêu là tìm lỗi. Đối với các xác nhận, mục tiêu là làm cho việc gỡ lỗi dễ dàng hơn bằng cách quan sát các trạng thái chương trình không hợp lệ ngay khi chúng xảy ra.
Lưu ý rằng không có kỹ thuật xác minh tính chính xác. Trong thực tế, nếu bạn tiến hành kiểm tra đơn vị với mục tiêu để xác minh chương trình là chính xác, bạn có thể sẽ đưa ra thử nghiệm không thú vị mà bạn biết sẽ hoạt động. Đó là một hiệu ứng tâm lý: bạn sẽ làm bất cứ điều gì để đáp ứng mục tiêu của bạn. Nếu mục tiêu của bạn là tìm lỗi, các hoạt động của bạn sẽ phản ánh điều đó.
Cả hai đều quan trọng, và có mục đích riêng của họ.
[Là một lưu ý cuối cùng về các xác nhận: Để có được giá trị cao nhất, bạn cần sử dụng chúng tại tất cả các điểm quan trọng trong chương trình của bạn và không phải là một vài chức năng chính. Mặt khác, nguồn gốc của vấn đề có thể đã bị che giấu và khó phát hiện mà không cần gỡ lỗi hàng giờ.]
:-)