Cách tiếp cận cụ thể để kiểm tra có giá trị như thế nào phụ thuộc vào mức độ quan trọng của hệ thống đang được phát triển và mức độ một số hệ thống quan trọng khác phụ thuộc vào nó. Một tập lệnh lưu bút đơn giản cho trang web của bạn khó có thể được coi là nhiệm vụ quan trọng, nhưng nếu trang web chạy trên đó có khả năng bị xâm phạm bởi một lỗi cho phép nhập vào cơ sở dữ liệu và trang web đó cung cấp một số dịch vụ quan trọng, thì nó đột nhiên trở nên nhiều hơn quan trọng đối với kịch bản lưu bút được kiểm tra kỹ lưỡng. Điều tương tự cũng đúng với mã khung / thư viện. Nếu bạn phát triển một khung có lỗi, thì mọi ứng dụng sử dụng tính năng khung đó cũng có lỗi tương tự.
Phát triển theo hướng kiểm tra cung cấp cho bạn thêm một lớp an toàn khi nói đến các bài kiểm tra. Nếu bạn viết các bài kiểm tra bên cạnh hoặc thậm chí sau mã bạn muốn kiểm tra, thì có nguy cơ thực sự là bạn làm bài kiểm tra sai. Nếu bạn viết tất cả các bài kiểm tra trước, thì cách mã hoạt động bên trong không thể ảnh hưởng đến những gì bạn viết bài kiểm tra, và do đó, ít có khả năng bạn vô tình viết các bài kiểm tra nghĩ rằng một đầu ra sai cụ thể là chính xác.
Phát triển theo hướng kiểm tra cũng khuyến khích các nhà phát triển của bạn viết mã dễ kiểm tra, vì họ không muốn tự mình làm nhiều việc hơn nữa! Mã dễ kiểm tra có xu hướng là mã dễ hiểu, tái sử dụng và bảo trì.
Và bảo trì là nơi bạn sẽ thực sự gặt hái những phần thưởng của TDD. Phần lớn các nỗ lực lập trình dành cho phần mềm là liên quan đến bảo trì. Điều này có nghĩa là thực hiện các thay đổi đối với mã trực tiếp để cung cấp cho nó các tính năng mới, sửa lỗi hoặc điều chỉnh nó theo các tình huống mới. Khi thực hiện các thay đổi như vậy, bạn muốn chắc chắn rằng những thay đổi bạn thực hiện có hiệu quả mong muốn và quan trọng hơn, chúng không có hiệu ứng bất ngờ. Nếu bạn có một bộ kiểm tra đầy đủ cho mã của mình, thì thật dễ dàng để xác minh rằng bất kỳ thay đổi nào bạn thực hiện không phá vỡ thứ gì khác và nếu những thay đổi bạn thực hiện sẽ phá vỡ thứ khác thì bạn có thể nhanh chóng tìm ra lý do tại sao. Những lợi ích là lâu dài.
Bạn đã nói như sau trong câu hỏi của bạn:
Tôi thấy một số lợi ích để viết bài kiểm tra cho một số điều, nhưng rất ít. Và trong khi tôi thích ý tưởng viết bài kiểm tra trước tiên, tôi thấy tôi đã dành nhiều thời gian hơn để cố gắng gỡ lỗi bài kiểm tra của mình để khiến họ nói điều tôi thực sự có ý nghĩa hơn là tôi gỡ lỗi mã thực tế. Điều này có thể là do mã kiểm tra thường phức tạp hơn nhiều so với mã mà nó kiểm tra. Tôi hy vọng đây chỉ là thiếu kinh nghiệm với các công cụ có sẵn (rspec trong trường hợp này).
Điều này dường như gợi ý cho tôi rằng bạn không hoàn toàn kiểm tra. Một bài kiểm tra đơn vị được cho là cực kỳ đơn giản, chỉ là một chuỗi các cuộc gọi phương thức, theo sau là một xác nhận để so sánh kết quả mong đợi với kết quả thực tế. Chúng có nghĩa là đơn giản vì các lỗi trong bài kiểm tra của bạn sẽ là thảm họa và nếu bạn đưa ra các vòng lặp, phân nhánh hoặc kiểm soát ném chương trình khác vào kiểm tra thì nhiều khả năng bài kiểm tra sẽ có lỗi được đưa vào. Nếu bạn đang dành nhiều thời gian để gỡ lỗi các bài kiểm tra thì điều đó cho thấy các bài kiểm tra của bạn quá phức tạp và bạn nên đơn giản hóa chúng.
Nếu các bài kiểm tra không thể được đơn giản hóa, thì thực tế đó cho thấy rằng có điều gì đó không đúng với mã đang được kiểm tra. Ví dụ: nếu lớp của bạn có các phương thức dài, các phương thức có nhiều câu lệnh if / otherif / other hoặc chuyển đổi hoặc một số lượng lớn các phương thức có tương tác phức tạp được quy định bởi trạng thái hiện tại của lớp thì các bài kiểm tra sẽ phải cực kỳ phức tạp để cung cấp bảo hiểm mã đầy đủ và kiểm tra tất cả các tình huống. Nếu lớp của bạn có các phụ thuộc được mã hóa cứng vào các lớp khác thì điều này một lần nữa sẽ làm tăng số lượng vòng bạn sẽ phải nhảy để kiểm tra mã của bạn một cách hiệu quả.
Nếu bạn giữ cho các lớp học của bạn nhỏ và tập trung cao độ, với các phương thức ngắn với một vài đường dẫn thực hiện và cố gắng loại bỏ trạng thái bên trong thì các bài kiểm tra có thể được đơn giản hóa. Và đây là loại mấu chốt của vấn đề. Mã tốt vốn đã dễ dàng để kiểm tra. Nếu mã không dễ kiểm tra thì có lẽ có gì đó không ổn với nó.
Viết bài kiểm tra đơn vị là một cái gì đó có lợi cho bạn về lâu dài, và tránh chúng chỉ đơn giản là lưu trữ rắc rối cho sau này. Bạn có thể không quen thuộc với khái niệm nợ kỹ thuật, nhưng nó hoạt động rất nhiều như nợ tài chính. Không viết bài kiểm tra, không bình luận mã, viết trong các phụ thuộc được mã hóa cứng và vì vậy là những cách để đi vào nợ nần. Bạn "mượn" thời gian bằng cách cắt giảm sớm và điều này có thể giúp bạn đạt được thời hạn chặt chẽ, nhưng thời gian bạn tiết kiệm sớm hơn trong dự án là cho vay. Mỗi ngày trôi qua mà không làm sạch mã, nhận xét đúng hoặc xây dựng bộ kiểm tra sẽ khiến bạn phải trả lãi. Càng kéo dài, tiền lãi tích lũy càng nhiều. Cuối cùng, bạn sẽ phát hiện ra mã của mình đã trở thành một mớ hỗn độn mà bạn không thể thay đổi mà không gây ra hậu quả ngoài ý muốn.
Bạn có thể nghĩ về việc viết bài kiểm tra đơn vị sớm và cập nhật chúng như một hình thức "tín dụng kỹ thuật". Bạn đang dành thời gian cho ngân hàng bằng cách dành thời gian sớm cho dự án theo thông lệ tốt. Bạn sẽ kiếm được tiền lãi từ tầm nhìn xa này sau này khi bạn đến giai đoạn bảo trì của dự án. Khi bạn muốn thực hiện thay đổi, bạn có thể dễ dàng xác nhận tính chính xác của thay đổi và nó không có bất kỳ tác dụng phụ không mong muốn nào và bạn có thể nhận được các bản cập nhật nhanh chóng và không phiền phức. Nếu lỗi xuất hiện, bạn có thể thêm một bài kiểm tra đơn vị mới thực hiện lỗi, sau đó sửa lỗi trong mã. Khi bạn chạy thử nghiệm tiếp theo, bạn sẽ có thể xác minh rằng lỗi đã được sửa và nó không gây ra bất kỳ vấn đề nào khác. Hơn nữa, bạn sẽ tránh được "hồi quy",
TL: DR - Vâng, họ là một trợ giúp trong thế giới thực, nhưng họ là một khoản đầu tư. Những lợi ích chỉ trở nên rõ ràng sau này.