2011-01-07 22 views
9

Nhóm của chúng tôi đang trong quá trình nới lỏng vào TDD và đấu tranh với các thực tiễn tốt nhất cho các bài kiểm tra đơn vị. Mã của chúng tôi được thử nghiệm sử dụng tiêm phụ thuộc. Các thử nghiệm của chúng tôi thường tuân theo loại bố cục Arrange-Act-Assert, nơi chúng tôi giả định các phụ thuộc trong phần Sắp xếp với Moq.Có thể tái sử dụng mocks vs mocking trong mỗi bài kiểm tra

Về mặt lý thuyết, kiểm tra đơn vị phải là lá chắn bảo vệ bạn khi bạn cấu trúc lại. Nhưng nó biến thành một cái neo ngăn cản chúng ta làm như vậy. Tôi đang cố gắng giải quyết vấn đề thất bại của chúng tôi ở đâu.

Hãy xem xét các ví dụ đơn giản:

  • XRepository.Save có nó chữ ký và hành vi/hợp đồng thay đổi.
  • XController.Save sử dụng XRepository.Save để nó được cấu trúc lại để sử dụng giao diện mới. Nhưng bên ngoài, hợp đồng công khai của nó không thay đổi.

Tôi hy vọng rằng các xét nghiệm điều khiển làm không cần phải được refactored, nhưng thay vào đó chứng minh với tôi rằng điều khiển mới của tôi thực hiện tôn vinh các hợp đồng không thay đổi. Nhưng chúng tôi đã thất bại ở đây vì đây không phải là trường hợp.

Mỗi kiểm tra bộ điều khiển sẽ kết nối giao diện kho lưu trữ khi đang di chuyển. Tất cả chúng cần phải được thay đổi. Hơn nữa, vì mỗi bài kiểm tra không muốn giả lập tất cả các giao diện và phương thức, chúng tôi tìm thấy thử nghiệm của chúng tôi gắn liền với việc thực hiện cụ thể bởi vì nó cần phải biết những phương pháp để mô phỏng.

Nó trở nên khó khăn hơn theo cấp số nhân để tái cấu trúc cho các thử nghiệm khác mà chúng tôi có! Hay chính xác hơn, càng nhiều lần chúng ta giả lập một giao diện.

Vì vậy, câu hỏi của tôi:

  1. Bất kỳ sở thích cho việc sử dụng on-the-fly chế giễu trong mỗi bài kiểm tra vs thực hiện một mô hình bằng tay tái sử dụng cho mỗi giao diện?

  2. Với câu chuyện của tôi, tôi thiếu một số nguyên tắc hoặc rơi vào một cạm bẫy phổ biến?

Cảm ơn!

+2

Bất cứ khi nào bạn cần chế nhạo thứ gì đó, trước tiên hãy nghĩ rằng nếu bạn có thể tạo mocks bằng tay.Bạn thường sẽ thấy rằng mô hình trực tuyến thường có mùi phức tạp. Nếu đó là trường hợp sau đó tạo mocks thủ công khác đi cho on-the-fly mocks –

+1

Một cái gì đó để xem xét: http://en.wikipedia.org/wiki/Interface_segregation_principle – TrueWill

Trả lời

9

Bạn không bỏ sót bất kỳ nguyên tắc nào, nhưng đó là vấn đề thường gặp. Tôi nghĩ rằng mỗi đội giải quyết nó (hoặc không) theo cách riêng của họ.

Tác dụng phụ

Bạn sẽ tiếp tục có vấn đề này với bất kỳ chức năng trong đó có tác dụng phụ. Tôi đã tìm thấy cho các chức năng tác dụng phụ tôi phải làm các xét nghiệm mà đảm bảo một số hoặc tất cả các nội dung sau:

  • rằng nó đã được/không được gọi
  • Số lần nó được gọi là
  • gì đối số là được chuyển đến số
  • Thứ tự cuộc gọi.

Đảm bảo điều này trong thử nghiệm thường có nghĩa là vi phạm đóng gói (Tôi tương tác và biết với việc triển khai). Bất cứ lúc nào bạn làm điều này, bạn sẽ luôn luôn ngầm thử nghiệm để thực hiện. Điều này sẽ khiến bạn phải cập nhật kiểm tra bất cứ khi nào bạn cập nhật các phần triển khai mà bạn đang trưng ra/thử nghiệm.

Reusable Mocks

Tôi đã sử dụng mocks thể tái sử dụng để có hiệu lực tuyệt vời. Họ thương mại-off là việc thực hiện của họ là phức tạp hơn bởi vì nó cần phải được hoàn chỉnh hơn. Bạn giảm thiểu chi phí cập nhật các bài kiểm tra để phù hợp với các nhà tái cấu trúc.

Chấp nhận TDD

lựa chọn khác là thay đổi những gì thử nghiệm của bạn cho. Vì điều này thực sự là về việc thay đổi chiến lược thử nghiệm của bạn, nó không phải là một cái gì đó để nhập vào nhẹ nhàng. Bạn có thể muốn thực hiện một phân tích nhỏ trước và xem liệu nó có thực sự phù hợp với hoàn cảnh của bạn hay không.

Tôi đã từng thực hiện TDD với các bài kiểm tra đơn vị. Tôi gặp phải một vấn đề mà tôi cảm thấy chúng ta không cần phải giải quyết. Cụ thể xung quanh các nhà tái cấu trúc, tôi nhận thấy chúng tôi thường phải cập nhật nhiều thử nghiệm. Các nhà tái cấu trúc này không nằm trong một đơn vị mã, mà là việc tái cơ cấu các thành phần chính. Tôi biết nhiều người sẽ nói vấn đề là những thay đổi lớn thường xuyên, không phải là thử nghiệm đơn vị. Có lẽ một số sự thật cho những thay đổi lớn là một phần kết quả của quy hoạch/kiến ​​trúc của chúng tôi. Tuy nhiên, nó cũng được thực hiện đối với các quyết định kinh doanh gây ra những thay đổi trong chỉ đường. Những nguyên nhân hợp pháp và khác có tác dụng đòi hỏi những thay đổi lớn đối với mã. Kết quả cuối cùng là các nhà tái cấu trúc lớn trở nên chậm chạp và đau đớn hơn là kết quả của tất cả các bản cập nhật thử nghiệm.

Chúng tôi cũng gặp lỗi do các sự cố tích hợp mà các kiểm tra đơn vị không bao gồm. Chúng tôi đã thực hiện một số thử nghiệm chấp nhận thủ công. Chúng tôi thực sự đã thực hiện khá nhiều công việc để thực hiện các bài kiểm tra chấp nhận ở mức độ thấp nhất có thể. Chúng vẫn là hướng dẫn sử dụng, và chúng tôi cảm thấy có quá nhiều sự giao thoa giữa các bài kiểm tra đơn vị và bài kiểm tra chấp nhận rằng cần có một cách để giảm thiểu chi phí triển khai cả hai.

Sau đó, công ty đã sa thải. Đột nhiên, chúng tôi không có cùng một lượng tài nguyên để lập trình và bảo trì. Chúng tôi đã được đẩy để có được lợi nhuận lớn nhất cho tất cả mọi thứ chúng tôi đã làm bao gồm thử nghiệm. Chúng tôi bắt đầu bằng cách thêm những gì chúng tôi gọi là kiểm tra ngăn xếp một phần để trang trải các vấn đề tích hợp chung mà chúng tôi có. Chúng hóa ra rất hiệu quả đến mức chúng tôi bắt đầu làm thử nghiệm đơn vị ít cổ điển hơn. Chúng tôi cũng đã loại bỏ các bài kiểm tra chấp nhận thủ công (Selenium). Chúng tôi từ từ đẩy lên nơi các bài kiểm tra bắt đầu thử nghiệm cho đến khi chúng tôi chủ yếu làm bài kiểm tra chấp nhận, nhưng không có trình duyệt. Chúng tôi sẽ mô phỏng phương thức GET, POST hoặc PUT cho một bộ điều khiển cụ thể và kiểm tra các tiêu chí chấp nhận.

  • Cơ sở dữ liệu đã được cập nhật một cách chính xác
  • Các mã trạng thái HTTP đúng được trả về
  • Một trang được trả lại rằng:
    • là hợp lệ html 4,01 nghiêm ngặt
    • chứa thông tin chúng tôi muốn gửi quay lại người dùng

Chúng tôi đã kết thúc có ít lỗi hơn. Cụ thể hầu như tất cả các lỗi tích hợp, và lỗi do các nhà tái cấu trúc lớn biến mất gần như hoàn toàn.

Có sự cân bằng. Nó chỉ bật ra những thuận xa hơn so với khuyết điểm cho tình hình ra. Nhược điểm:

  • Thử nghiệm thường phức tạp hơn và hầu hết mọi người đều kiểm tra một số tác dụng phụ.
  • Chúng tôi có thể biết khi nào có sự cố xảy ra, nhưng nó không được nhắm mục tiêu như các bài kiểm tra đơn vị vì vậy chúng tôi phải thực hiện thêm gỡ lỗi để theo dõi vấn đề ở đâu.
+0

Cảm ơn. Tôi nghĩ chúng ta đang đi theo hướng này. Hiện nay chúng tôi có các bài kiểm tra tích hợp đi từ các đối tượng cấp miền xuống - chúng không đi xa như kiểm tra các bộ điều khiển trực tiếp. Bộ điều khiển vẫn được thử nghiệm bằng cách chế nhạo phụ thuộc của họ. Cảm ơn các ý kiến. –

1

Tôi đã đấu tranh với loại vấn đề này bản thân mình và không có một câu trả lời mà tôi cảm thấy là vững chắc, nhưng đây là một cách suy nghĩ dự kiến. Tôi quan sát hai loại xét nghiệm Đơn vị

  1. Có những thử nghiệm khi thực hiện Giao diện công cộng, đây là những điều rất quan trọng nếu chúng ta tái cấu trúc với sự tự tin, chúng chứng minh rằng chúng tôi tôn trọng hợp đồng của chúng tôi với khách hàng. Những thử nghiệm này được phục vụ tốt nhất bởi một mô hình tái sử dụng được chế tác thủ công, giao dịch với một tập hợp nhỏ dữ liệu thử nghiệm.
  2. Có các thử nghiệm "mức độ phù hợp". Những xu hướng này là để chứng minh rằng việc triển khai của chúng tôi hoạt động chính xác khi phụ thuộc không đúng. Những điều này tôi nghĩ là cần thiết trên các con tàu bay để kích động các đường dẫn triển khai cụ thể.
+0

Cảm ơn bạn đã bình luận. Nó xác nhận một số suy nghĩ của tôi. Tôi nghĩ rằng tôi đã cố gắng tập trung nhiều hơn vào các bài kiểm tra hợp đồng và suy nghĩ nếu một con đường mã không phục vụ một phần của hợp đồng đó là thừa. Nhưng có lẽ chúng ta cần phải thực dụng hơn. –

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