Các câu trả lời hiện tại chắc chắn là tốt, nhưng tôi chưa thấy ai giải quyết quan niệm sai lầm cơ bản này trong câu hỏi:
tại bất kỳ thời điểm nào, tất cả các bài kiểm tra đơn vị phải vượt qua
Không. Chắc chắn nhất, điều này sẽ không đúng. Trong khi tôi đang phát triển phần mềm, NCrunch thường là màu nâu (lỗi xây dựng) hoặc màu đỏ (thử nghiệm thất bại).
Trường hợp NCrunch cần có màu xanh (tất cả các thử nghiệm đã qua) là khi tôi sẵn sàng đẩy một cam kết đến máy chủ kiểm soát nguồn, vì tại thời điểm đó, những người khác có thể phụ thuộc vào mã của tôi.
Điều này cũng đưa vào chủ đề tạo các thử nghiệm mới: các thử nghiệm phải khẳng định logic và hành vi của mã. Điều kiện biên, điều kiện lỗi, v.v. Khi tôi viết bài kiểm tra mới, tôi cố gắng xác định những "điểm nóng" này trong mã.
Đơn vị kiểm tra tài liệu về cách tôi mong đợi mã của mình được gọi - điều kiện tiên quyết, đầu ra dự kiến, v.v.
Nếu một thử nghiệm bị phá vỡ sau một thay đổi, tôi cần phải quyết định xem mã hoặc thử nghiệm có bị lỗi hay không.
Là một lưu ý phụ, thử nghiệm đơn vị đôi khi đi đôi với Phát triển hướng thử nghiệm. Một trong những nguyên tắc của TDD là các bài kiểm tra bị hỏng là kim chỉ nam của bạn. Khi kiểm tra thất bại, bạn cần sửa mã để kiểm tra vượt qua. Đây là một ví dụ cụ thể từ đầu tuần này:
Bối cảnh : Tôi đã viết và hiện hỗ trợ một thư viện được sử dụng bởi các nhà phát triển của chúng tôi được sử dụng để xác thực các truy vấn của Oracle. Chúng tôi đã có các thử nghiệm khẳng định rằng truy vấn phù hợp với một số giá trị dự kiến, điều này làm cho trường hợp quan trọng (không phải trong Oracle) và được phê duyệt một cách vui vẻ các truy vấn không hợp lệ miễn là chúng hoàn toàn khớp với giá trị mong đợi.
Thay vào đó, thư viện của tôi phân tích cú pháp truy vấn bằng Antlr và cú pháp Oracle 12c, sau đó kết thúc các xác nhận khác nhau trên chính cây cú pháp. Những thứ như, nó hợp lệ (không có lỗi phân tích cú pháp nào), tất cả các tham số của nó được thỏa mãn bởi bộ sưu tập tham số, tất cả các cột dự kiến được đọc bởi trình đọc dữ liệu đều có trong truy vấn, v.v ... Tất cả đều là các mục được chuyển qua sản xuất ở nhiều thời điểm
Một trong những kỹ sư đồng nghiệp của tôi đã gửi cho tôi một truy vấn vào thứ Hai đã thất bại (hay đúng hơn, đã thành công khi đáng lẽ nó phải thất bại) vào cuối tuần. Thư viện của tôi nói rằng cú pháp là tốt, nhưng nó đã nổ tung khi máy chủ cố gắng chạy nó. Và khi anh nhìn vào truy vấn, rõ ràng là tại sao:
UPDATE my_table(
SET column_1 = 'MyValue'
WHERE id_column = 123;
Tôi đã tải lên dự án và thêm một bài kiểm tra đơn vị khẳng định rằng truy vấn này không hợp lệ. Rõ ràng, thử nghiệm thất bại.
Tiếp theo, tôi đã gỡ lỗi bài kiểm tra thất bại, bước qua mã mà tôi dự đoán sẽ đưa ra ngoại lệ và nhận ra rằng Antlr đang đưa ra một lỗi trên paren mở, không phải theo cách mà mã trước đó đang mong đợi. Tôi đã sửa đổi mã, xác minh rằng thử nghiệm hiện tại màu xanh lá cây (đã qua) và không có ai khác bị hỏng trong quá trình, cam kết và đẩy.
Việc này có thể mất 20 phút và trong quá trình tôi thực sự đã cải thiện thư viện một cách đáng kể vì giờ đây nó đã hỗ trợ toàn bộ một loạt các lỗi mà trước đây nó đã bỏ qua. Nếu tôi không có bài kiểm tra đơn vị cho thư viện, việc nghiên cứu và khắc phục sự cố có thể mất nhiều giờ.