Giới thiệu ngắn về câu hỏi này. Tôi đã sử dụng TDD và gần đây là BDD trong hơn một năm nay. Tôi sử dụng các kỹ thuật như chế giễu để làm cho bài kiểm tra của mình hiệu quả hơn. Gần đây tôi đã bắt đầu một dự án cá nhân để viết một chương trình quản lý tiền nhỏ cho mình. Vì tôi không có mã kế thừa nên đây là dự án hoàn hảo để bắt đầu với TDD. Thật không may, tôi đã không trải nghiệm niềm vui của TDD rất nhiều. Nó thậm chí còn làm hỏng niềm vui của tôi đến nỗi tôi đã từ bỏ dự án.
Có vấn đề gì thế? Vâng, tôi đã sử dụng phương pháp như TDD để cho phép các bài kiểm tra / yêu cầu phát triển thiết kế chương trình. Vấn đề là hơn một nửa thời gian phát triển như đối với các bài kiểm tra viết / tái cấu trúc. Vì vậy, cuối cùng tôi không muốn thực hiện thêm bất kỳ tính năng nào vì tôi sẽ cần phải cấu trúc lại và viết cho nhiều bài kiểm tra.
Trong công việc tôi có rất nhiều mã di sản. Ở đây tôi viết ngày càng nhiều bài kiểm tra tích hợp và chấp nhận và bài kiểm tra đơn vị ít hơn. Đây dường như không phải là một cách tiếp cận tồi vì các lỗi chủ yếu được phát hiện bởi các bài kiểm tra chấp nhận và tích hợp.
Ý tưởng của tôi là, cuối cùng tôi có thể viết nhiều bài kiểm tra tích hợp và chấp nhận hơn bài kiểm tra đơn vị. Giống như tôi đã nói để phát hiện lỗi, các bài kiểm tra đơn vị không tốt hơn các bài kiểm tra tích hợp / chấp nhận. Kiểm tra đơn vị cũng tốt cho thiết kế. Vì tôi thường viết rất nhiều trong số chúng, các lớp của tôi luôn được thiết kế để có thể kiểm tra tốt. Ngoài ra, cách tiếp cận để cho các thử nghiệm / yêu cầu hướng dẫn thiết kế dẫn trong hầu hết các trường hợp để thiết kế tốt hơn. Ưu điểm cuối cùng của bài kiểm tra đơn vị là chúng nhanh hơn. Tôi đã viết đủ các bài kiểm tra tích hợp để biết, rằng chúng có thể nhanh gần như các bài kiểm tra đơn vị.
Sau khi tôi xem qua web tôi phát hiện ra rằng có những ý tưởng rất giống với tôi được đề cập ở đây và ở đó . Bạn nghĩ gì về ý tưởng này?
Biên tập
Trả lời các câu hỏi một ví dụ về thiết kế tốt, nhưng tôi cần một cấu trúc lại rất lớn cho yêu cầu tiếp theo:
Lúc đầu, có một số yêu cầu để thực hiện các lệnh nhất định. Tôi đã viết một trình phân tích cú pháp lệnh có thể mở rộng - trong đó phân tích cú pháp các lệnh từ một số loại dấu nhắc lệnh và gọi đúng lệnh trên mô hình. Kết quả được biểu diễn trong lớp mô hình khung nhìn:
Không có gì sai ở đây. Tất cả các lớp là độc lập với nhau và tôi có thể dễ dàng thêm các lệnh mới, hiển thị dữ liệu mới.
Yêu cầu tiếp theo là, mỗi lệnh nên có biểu diễn khung nhìn riêng - một số loại xem trước kết quả của lệnh. Tôi đã thiết kế lại chương trình để đạt được một thiết kế tốt hơn cho yêu cầu mới:
Điều này cũng tốt vì bây giờ mỗi lệnh có mô hình khung nhìn riêng và do đó xem trước riêng.
Vấn đề là, trình phân tích cú pháp lệnh đã được thay đổi để sử dụng phân tích cú pháp dựa trên mã thông báo của các lệnh và bị tước khỏi khả năng thực thi các lệnh của nó. Mỗi lệnh có mô hình khung nhìn riêng và mô hình khung nhìn dữ liệu chỉ biết mô hình khung nhìn lệnh hiện tại, hơn là biết dữ liệu phải được hiển thị.
Tất cả những gì tôi muốn biết vào thời điểm này là, nếu thiết kế mới không phá vỡ bất kỳ yêu cầu hiện có nào. Tôi không phải thay đổi BẤT K of bài kiểm tra chấp nhận nào của mình. Tôi đã phải cấu trúc lại hoặc xóa gần MỌI bài kiểm tra đơn vị, đó là một đống công việc khổng lồ.
Những gì tôi muốn thể hiện ở đây là một tình huống phổ biến thường xảy ra trong quá trình phát triển. Không có vấn đề gì với các thiết kế cũ hay mới, chúng chỉ thay đổi tự nhiên với các yêu cầu - tôi hiểu nó như thế nào, đây là một lợi thế của TDD, rằng thiết kế phát triển.
Phần kết luận
Cảm ơn tất cả các câu trả lời và thảo luận. Tóm lại cuộc thảo luận này tôi đã nghĩ đến một cách tiếp cận mà tôi sẽ thử nghiệm với dự án tiếp theo của mình.
- Trước hết tôi viết tất cả các bài kiểm tra trước khi thực hiện bất cứ điều gì như tôi luôn làm.
- Đối với các yêu cầu đầu tiên tôi viết một số bài kiểm tra chấp nhận kiểm tra toàn bộ chương trình. Sau đó, tôi viết một số thử nghiệm tích hợp cho các thành phần mà tôi cần thực hiện yêu cầu. Nếu có một thành phần phối hợp chặt chẽ với một thành phần khác để thực hiện yêu cầu này, tôi cũng sẽ viết một số thử nghiệm tích hợp trong đó cả hai thành phần được thử nghiệm cùng nhau. Cuối cùng nhưng không kém phần quan trọng nếu tôi phải viết một thuật toán hoặc bất kỳ lớp nào khác có độ hoán vị cao - ví dụ: trình tuần tự hóa - tôi sẽ viết các bài kiểm tra đơn vị cho các lớp cụ thể này. Tất cả các lớp khác không được kiểm tra nhưng bất kỳ bài kiểm tra đơn vị.
- Đối với lỗi quá trình có thể được đơn giản hóa. Thông thường một lỗi được gây ra bởi một hoặc hai thành phần. Trong trường hợp này tôi sẽ viết một bài kiểm tra tích hợp cho các thành phần kiểm tra lỗi. Nếu nó liên quan đến một thuật toán, tôi sẽ chỉ viết một bài kiểm tra đơn vị. Nếu không dễ dàng phát hiện thành phần xảy ra lỗi, tôi sẽ viết một bài kiểm tra chấp nhận để xác định vị trí lỗi - đây phải là một ngoại lệ.