Các thử nghiệm ở đó để hỗ trợ và đảm bảo lập trình phòng thủ
Lập trình phòng thủ bảo vệ tính toàn vẹn của hệ thống khi chạy.
Các xét nghiệm là các công cụ chẩn đoán (chủ yếu là tĩnh). Trong thời gian chạy, các bài kiểm tra của bạn không ở đâu trong tầm nhìn. Chúng giống như giàn giáo được sử dụng để dựng lên một bức tường gạch cao hoặc một mái vòm bằng đá. Bạn không để các bộ phận quan trọng ra khỏi cấu trúc vì bạn có một giàn giáo giữ nó trong khi xây dựng. Bạn có một giàn giáo giữ nó trong khi xây dựng để tạo điều kiện cho tất cả các phần quan trọng vào.
EDIT: Một sự tương tự
Điều gì về một sự tương tự với ý kiến trong mã?
Nhận xét có mục đích của họ, nhưng có thể là dư thừa hoặc thậm chí có hại. Ví dụ: nếu bạn đưa kiến thức nội tại về mã vào các bình luận , sau đó thay đổi mã, các bình luận trở nên không liên quan ở mức tốt nhất và có hại ở mức tồi tệ nhất.
Vì vậy, giả sử bạn đưa nhiều kiến thức nội tại về cơ sở mã của mình vào các bài kiểm tra, chẳng hạn như Phương thứcA không thể lấy giá trị và đối số của Phương thức phải có > 0
. Sau đó, mã thay đổi. Null hiện đã ổn cho A và B có thể lấy các giá trị nhỏ bằng -10. Các xét nghiệm hiện tại đã sai chức năng, nhưng sẽ tiếp tục vượt qua.
Có, bạn nên cập nhật các bài kiểm tra cùng lúc bạn cập nhật mã. Bạn cũng nên cập nhật (hoặc xóa) các bình luận cùng lúc bạn cập nhật mã. Nhưng tất cả chúng ta đều biết những điều này không phải lúc nào cũng xảy ra, và những sai lầm đó đã được tạo ra.
Các xét nghiệm xác minh hành vi của hệ thống. Hành vi thực tế đó là nội tại đối với chính hệ thống, không phải nội tại đối với các thử nghiệm.
Cái gì có thể đi sai?
Mục tiêu liên quan đến các bài kiểm tra là nghĩ ra mọi thứ có thể sai, viết một bài kiểm tra cho nó để kiểm tra hành vi đúng, sau đó tạo mã thời gian chạy để nó vượt qua tất cả các bài kiểm tra.
Điều đó có nghĩa là lập trình phòng thủ là điểm chính .
TDD thúc đẩy lập trình phòng thủ, nếu các bài kiểm tra là toàn diện.
Nhiều bài kiểm tra, lái xe lập trình nhiều hơn
Khi tìm thấy lỗi chắc chắn, nhiều bài kiểm tra được viết để mô hình hóa các điều kiện biểu hiện lỗi. Sau đó, mã được sửa, với mã để thực hiện các thử nghiệm đó và các thử nghiệm mới vẫn nằm trong bộ thử nghiệm.
Một tập hợp các bài kiểm tra tốt sẽ chuyển cả đối số tốt và xấu cho hàm / phương thức và mong đợi kết quả nhất quán. Điều này, đến lượt nó, có nghĩa là thành phần được thử nghiệm sẽ sử dụng kiểm tra điều kiện tiên quyết (lập trình phòng thủ) để xác nhận các đối số được truyền cho nó.
Nói chung ...
Ví dụ: nếu một đối số null cho một thủ tục cụ thể là không hợp lệ, thì ít nhất một thử nghiệm sẽ vượt qua null và nó sẽ xuất hiện một ngoại lệ / lỗi "đối số null không hợp lệ".
Tất nhiên, ít nhất một thử nghiệm khác sẽ vượt qua một đối số hợp lệ - hoặc lặp qua một mảng lớn và vượt qua nhiều đối số hợp lệ - và xác nhận rằng trạng thái kết quả là phù hợp.
Nếu một bài kiểm tra không vượt qua được đối số null đó và bị tát với ngoại lệ dự kiến (và ngoại lệ đó đã bị ném vì mã kiểm tra chắc chắn trạng thái được truyền cho nó), thì null có thể được gán cho một thuộc tính của một lớp hoặc bị chôn vùi trong một bộ sưu tập của một số nơi mà nó không nên
Điều này có thể gây ra hành vi không mong muốn trong một số phần hoàn toàn khác của hệ thống mà cá thể lớp được truyền tới, ở một số địa điểm địa lý xa sau khi phần mềm đã xuất xưởng . Và đó là thứ chúng ta thực sự đang cố tránh, phải không?
Nó thậm chí có thể tồi tệ hơn. Ví dụ lớp với trạng thái không hợp lệ có thể được tuần tự hóa và được lưu trữ, chỉ gây ra lỗi khi nó được hoàn nguyên để sử dụng sau này. Geez, tôi không biết, có lẽ đó là một hệ thống điều khiển cơ học thuộc loại nào đó không thể khởi động lại sau khi tắt máy vì nó không thể khử lưu lượng trạng thái cấu hình liên tục của chính nó. Hoặc cá thể lớp có thể được tuần tự hóa và được chuyển đến một số hệ thống hoàn toàn khác được tạo bởi một thực thể khác và hệ thống đó có thể bị sập.
Đặc biệt là nếu các lập trình viên của hệ thống khác không viết mã phòng thủ.