2009-06-19 25 views
10

Tôi đang cố gắng thực hành TDD.Khám phá các đối tượng khác khi đang thực hiện TDD

hiểu biết của tôi là TDD nên đi như thế này

  1. Viết một danh sách kiểm tra cho giao diện/lớp tôi sẽ phát triển.
  2. Bắt đầu với thử nghiệm không được triển khai dễ dàng nhất từ ​​danh sách thử nghiệm của tôi.
  3. Viết thử nghiệm, chưa có mã triển khai.
  4. Viết giao diện của lớp để biên dịch mã.
  5. Chạy thử nghiệm dẫn đến một lần kiểm tra không thành công.
  6. Viết triển khai thực hiện kiểm tra.
  7. Refactor mess tôi đã thực hiện.
  8. Chuyển đến 2.

Vấn đề tôi có là khi viết thực hiện hoặc thực hiện tái cấu trúc. Tôi thường đi đến kết luận rằng việc thực hiện tôi vừa viết nên được giao cho một lớp khác.

TDD'r thực sự nên làm gì vào thời điểm này?

  1. Rời khỏi danh sách kiểm tra hiện một mình trong một thời gian và tạo một hình mới cho các lớp mới được phát hiện (cùng một vấn đề có thể biểu hiện bản thân khi thực hiện lớp mới, dĩ nhiên)
  2. Hãy đi theo một Interaction Dựa của thử nghiệm và Mock lớp mới, tiếp tục với testcases của lớp bạn đang làm việc và quay lại sau để tạo ra một cách thực hiện đúng của lớp giả.
  3. Tình huống này không nên hiện diện. Tôi có lẽ đã không nghĩ ra thiết kế ban đầu của tôi đủ tốt. (nhưng sẽ không đánh bại một trong những mục đích của TDD ?!).

Tôi rất muốn biết cách người khác xử lý các tình huống này.

Trả lời

9

Đừng tìm kiếm mối quan hệ một-một giữa các bài kiểm tra và các lớp học của bạn. Nếu bạn quyết định giới thiệu một lớp mới, hãy cho phép tái cấu trúc được hỗ trợ bởi bài kiểm tra gốc và thêm bài kiểm tra vào vị trí thích hợp (nơi phụ thuộc vào trường hợp cụ thể) khi bạn muốn thêm chức năng (hoặc kiểm tra các tình huống bạn cần) để trang trải mà bạn chưa thử nghiệm).

Tôi sẽ thêm rằng thành công chính trong TDD là đi vào nhịp điệu của công cụ tái cấu trúc xanh đỏ. Khi bạn cảm thấy lợi ích của nhịp điệu đó, bạn đã bắt đầu "có được" nó. Đó không phải là để nói rằng bạn sẽ tìm thấy nó đáng giá trong mọi trường hợp, nhưng cho đến khi bạn cảm thấy nhịp điệu mà bạn đã không nhận được những gì người ủng hộ của nó như về nó.

Và thường có (đặc biệt là trong các ứng dụng phức tạp về kiến ​​trúc, như các ứng dụng n-tier) một số thiết kế phía trước. Không có gì phác thảo bằng đá, nhưng đủ để cung cấp cho các đơn vị một nơi để đi. Tất nhiên kiến ​​trúc có thể phát triển trong một phương pháp nhanh nhẹn, nhưng một ý tưởng chung về cảnh quan cần phải có nếu có nhiều lớp cho kiến ​​trúc.

EDIT: (Để trả lời nhận xét). Lớp học mới có nên tự kiểm tra không? Không cần thiết.Nó phụ thuộc nếu lớp học phát triển tầm quan trọng của riêng nó. Khi bạn đang thử nghiệm đơn vị, bạn đang thử nghiệm một phần chức năng. Nó không phải là một bài kiểm tra tích hợp chỉ vì có hai lớp liên quan. Nó trở thành một thử nghiệm tích hợp khi hai đơn vị bắt đầu tương tác. Ranh giới tôi thường nghĩ là nếu tôi phải thiết lập trạng thái quan trọng trong nhóm-của-lớp A để tương tác với nhóm-của-lớp B, và đặc biệt nếu nhóm-của-lớp A gọi các nhóm-của-lớp B và những gì Tôi quan tâm đến thử nghiệm là làm thế nào B phản ứng với A, sau đó tôi nhìn vào một thử nghiệm tích hợp.

+1

Nhưng lớp mới nên được kiểm tra theo cách riêng của mình, phải không? Nếu thiết kế đưa bạn đến một điểm mà bạn muốn tạo nhiều lớp "hỗ trợ", kiểm thử đơn vị bạn đã bắt đầu với đang trở thành một bài kiểm tra tích hợp. –

1

Bạn nên tạo một lớp mô phỏng. Một giao diện duy nhất có thể dự đoán được. Vì vậy, bạn có thể kiểm tra bản gốc.

Sau đó, bạn có thể lặp lại quy trình với lớp mới.

+1

Thực ra đây là những gì tôi nghĩ tôi nên làm nhưng ngoài kia, có một cuộc chiến thánh thiện diễn ra về "dựa trên trạng thái" và "thử nghiệm dựa trên tương tác". Tôi không thích thực tế là giải pháp này liên kết các bài kiểm tra của bạn với một khai báo cụ thể của một giao diện mà bạn sử dụng. Trong thử nghiệm dựa trên trạng thái, tôi có thể thay đổi khai báo giao diện của lớp hỗ trợ (rất có thể) mà không phải thay đổi testcases của mình. Sử dụng thử nghiệm dựa trên tương tác, tôi cũng phải thay đổi testcases. –

2

Khi tôi gặp phải tình huống này, tôi làm theo giải pháp của bạn # 1. Tiếp tục đệ quy, tạo nhiều lớp như bạn cảm thấy phù hợp, cho đến khi bạn có một bộ sưu tập các triển khai mà bạn hài lòng. Với kinh nghiệm, bạn sẽ thấy rằng thiết kế của bạn phản ánh trải nghiệm của bạn và loại điều này sẽ không xảy ra nhiều.

+0

Đó là khá nhiều những gì tôi đang làm bây giờ nhưng tôi không thích thực tế là nó phân tâm bạn khỏi lớp bạn đang thử nghiệm. Sau một thời gian bạn quay trở lại lớp học đó và cố gắng tìm ra nơi bạn rời đi. –

+1

Như Yishai đã nói, bạn không nên nghĩ về các lớp kiểm tra. Bạn đang thử nghiệm việc triển khai các giải pháp cho các vấn đề và nếu việc triển khai xảy ra với một số lớp, điều đó là tốt. –

6

Tôi có vấn đề là khi tôi đến vào thời điểm 6 & 7, tại một số điểm trong thời gian tôi luôn đến kết luận rằng việc thực hiện Tôi chỉ viết nên được giao cho lớp khác.

Nhận ra thiết kế của bạn sẽ tốt hơn với một lớp khác - đó là thiết kế và đó là điểm của TDD. Vì vậy, đó là một điều tốt đẹp, và nó không nên làm phiền bạn.

Nhưng nó làm phiền bạn. Vậy lam gi? Nhận biết rằng ủy nhiệm cho một lớp khác là tái cấu trúc; đây là một cái gì đó để được thực hiện sau khi bước 6, trong bước 7. Một khi bạn đang màu xanh lá cây, refactor đến một thiết kế tốt hơn. Bạn đã có các bài kiểm tra cho lớp mới; họ chỉ có dây để gọi lớp gốc. Điều đó hoàn toàn ổn. Sau khi giải nén lớp và ủy nhiệm, nếu bạn cảm thấy thoải mái hơn khi các bài kiểm tra gọi trực tiếp lớp được trích xuất: hãy vào nó. Không có hại. Nếu lớp được trích xuất bắt đầu được sử dụng bởi những người gọi khác, tôi muốn giới thiệu nó, và có thể khi bạn bắt đầu gọi nó từ các lớp khác là thời điểm tốt để làm điều đó (nhưng nếu nó lỗi bạn bây giờ, hãy làm ngay bây giờ).

+0

Rất thực dụng, cảm ơn bạn. –

Các vấn đề liên quan