Một trong những dự án tôi đã thực hiện được thử nghiệm đơn vị nhiều; chúng tôi đã có hơn 1000 bài kiểm tra đơn vị cho 20 lớp hoặc hơn. Có nhiều mã thử nghiệm hơn mã sản xuất. Các bài kiểm tra đơn vị bắt gặp các lỗi vô số được giới thiệu trong các hoạt động tái cấu trúc; họ chắc chắn làm cho nó dễ dàng và an toàn để thực hiện thay đổi, mở rộng chức năng, vv Mã phát hành có tỷ lệ lỗi rất thấp.
Để khuyến khích chính mình viết các bài kiểm tra đơn vị, chúng tôi đặc biệt chọn giữ chúng nhanh chóng và bẩn thỉu - chúng tôi sẽ thử nghiệm khi chúng tôi tạo mã dự án và các bài kiểm tra nhàm chán và 'không phải mã thực', vì vậy ngay sau khi chúng tôi viết một tập lệnh thực hiện chức năng của mã sản xuất, chúng tôi đã hoàn thành và tiếp tục. Tiêu chí duy nhất cho mã thử nghiệm là nó hoàn toàn thực hiện API của mã sản xuất.
Điều chúng tôi học được một cách khó khăn là cách tiếp cận này không mở rộng quy mô. Khi mã được phát triển, chúng tôi thấy cần phải thay đổi mẫu giao tiếp giữa các đối tượng của chúng tôi, và đột nhiên tôi có 600 bài kiểm tra đơn vị không thành công! Việc sửa lỗi này đã khiến tôi mất vài ngày. Mức độ phá vỡ thử nghiệm này xảy ra hai hoặc ba lần với các cấu trúc lại cấu trúc lớn hơn nữa. Trong mỗi trường hợp, tôi không tin rằng chúng ta có thể dự đoán được sự tiến hóa mã được yêu cầu trước đó một cách hợp lý.
Yếu tố đạo đức của câu chuyện đối với tôi là: mã kiểm tra đơn vị cần phải sạch như mã sản xuất. Bạn chỉ đơn giản là không thể lấy đi với cuttting và dán trong các bài kiểm tra đơn vị. Bạn cần phải áp dụng tái cấu trúc hợp lý và tách các thử nghiệm của bạn khỏi mã sản xuất nếu có thể bằng cách sử dụng các đối tượng proxy.
Tất nhiên điều này làm tăng thêm sự phức tạp và chi phí cho các bài kiểm tra đơn vị của bạn (và có thể giới thiệu lỗi cho các bài kiểm tra của bạn!), Do đó, nó là một sự cân bằng tốt. Nhưng tôi tin rằng khái niệm 'kiểm tra đơn vị', được thực hiện một cách độc lập, không phải là chiến thắng rõ ràng và rõ ràng mà nó thường được tạo ra. Kinh nghiệm của tôi là các bài kiểm tra đơn vị, giống như mọi thứ khác trong lập trình, đòi hỏi sự chăm sóc, và không phải là một phương pháp có thể được áp dụng một cách mù quáng. Do đó nó gây ngạc nhiên cho tôi rằng tôi đã không thấy nhiều cuộc thảo luận về chủ đề này trên các diễn đàn như thế này và trong văn học.
Nguồn
2009-07-28 09:37:31
Điều này không có nghĩa là thiết kế thử nghiệm đơn vị không tốt? – txwikinger
@txwikinger, tôi không thấy nó có thể là thiết kế tồi. Nếu bạn kiểm tra đơn vị cấp API và thay đổi API, nó sẽ dẫn đến những thay đổi tương ứng trong các bài kiểm tra đơn vị. – JaredPar
Vâng .. kiểm tra đơn vị kiểm tra chống lại các đặc điểm kỹ thuật. Nếu điều đó thay đổi, kiểm tra đơn vị cũng cần thay đổi. Tôi có thể nghĩ rằng nó là tốt như vậy, kể từ khi thay đổi API có khả năng gây ra vỡ ở một nơi khác. – txwikinger