2012-04-12 33 views
30

Làm thế nào để mô phỏng nhiều phụ thuộc cần thiết cho các bài kiểm tra tích hợp?Mocking cho các bài kiểm tra tích hợp

Tôi sử dụng Mockito cho bài kiểm tra đơn vị 'thuần' của mình. 'Tinh khiết' trong trường hợp này có nghĩa là thử nghiệm một lớp duy nhất, chế nhạo tất cả các phụ thuộc của nó. Đẹp.

Bây giờ, đến kiểm tra tích hợp. Hãy nói rằng trong trường hợp này là một thử nghiệm hội nhập sẽ kiểm tra một cái gì đó như thế này:

  1. nhắn được đặt trên một hàng đợi
  2. nhắn được 'xử lý'
  3. Response message được đặt trên một hàng đợi phản ứng

Hãy cũng nói rằng quá trình xử lý xảy ra ở bước 2 là những thứ nghiêm trọng. Nó dựa trên nhiều tương tác cơ sở dữ liệu, trên nhiều dịch vụ bên ngoài, hệ thống tệp, tất cả mọi thứ. Ngoài ra còn có rất nhiều tác dụng phụ mà dòng chảy sẽ kích hoạt, vì vậy tôi không thể chỉ đơn giản là đảm bảo rằng phản ứng là chính xác - Tôi cần phải xác minh các tác dụng phụ.

Mỗi phụ thuộc trong số này được bao bọc bởi một lớp dịch vụ không trạng thái đơn lẻ, điều này làm cho chúng trở nên tốt đẹp và có thể mô phỏng.

Mọi người xử lý việc này như thế nào?

Tôi rất thích sử dụng Mockito để tôi có thể xác minh các tác dụng phụ mà luồng trên sẽ có. Tuy nhiên, tài liệu của Mocktio (và đến một mức độ lớn nó thực hiện) dường như chiến đấu mạnh mẽ chống lại việc sử dụng nó trong các ngữ cảnh khác với các thử nghiệm đơn vị 'thuần khiết'. Tôi đã cố gắng để đi tuyến đường này, nhưng

  • Thật khó để cư dữ liệu còn sơ khai (như có rất nhiều của nó)
  • Thật khó để có mùa xuân tiêm những trường hợp stubbed vào đậu của tôi
  • Thật khó để 'đặt lại' các mocks để tôi có thể xác minh một tập hợp tương tác khác mà không xóa các phần tử.

EDIT

Tôi biết rằng tôi có thể xử lý các vấn đề cơ sở dữ liệu với một cái gì đó giống như một thể hiện HSQLDB, nhưng vẫn có những vấn đề của các dịch vụ bên ngoài. Để lặp lại, tôi không thể dựa vào những dịch vụ đang được lên, đang ở trong trạng thái mà tôi yêu cầu, vv Các tùy chọn duy nhất tôi thấy có để chế giễu chúng.

Whatdaya làm gì?

+1

Chỉ cần làm rõ, vì thử nghiệm tích hợp có thể được thực hiện theo hai cách. Có vẻ như bạn có nghĩa là thử nghiệm tích hợp như trong, kiểm tra rằng các thành phần kết nối hoạt động tốt với nhau (về cơ bản là thử nghiệm các API). Tuy nhiên, đôi khi tích hợp đề cập đến end-to-end, vì vậy bạn sẽ không thử dịch vụ của bạn và thực sự cho phép nó để đạt cơ sở dữ liệu. Việc làm rõ này có thể giúp giải đáp ... Vui lòng xem http://stackoverflow.com/questions/4904096/whats-the-difference-between-unit-functional-acceptance-and-integration-test để làm rõ thêm các loại –

+0

thực sự áp dụng cho bất kỳ kiểm tra (tích hợp hoặc end-to-end) mà đòi hỏi rất nhiều phụ thuộc bên ngoài. Ví dụ tôi có thể thay thế các cơ sở dữ liệu của tôi bằng một cá thể HSQLDB, nhưng tôi vẫn có tất cả các dịch vụ khác. Sẽ chỉnh sửa câu hỏi một chút để làm rõ .. –

+0

Vì vậy, làm thế nào bạn giải quyết vấn đề mocking cuối cùng? – Pupsik

Trả lời

7

Câu hỏi hay.

Dường như bạn đã đạt đến giới hạn của Mockito. Mockito là tuyệt vời nếu những gì bạn muốn kiểm tra tương tác đối tượng.

Điều bạn muốn, mặc dù, có vẻ là khả năng quan sát (và khả năng kiểm soát) ở mức trừu tượng cao hơn. Tôi sợ rằng các mocks hoặc cuống bạn cần cho rằng cần được thiết kế cẩn thận và thủ công.

Ở cấp độ đơn vị, các mocks này có thể được tạo ra độc đáo, bằng phương tiện của Mockito. Ở cấp độ tích hợp, điều này trở nên khó khăn hơn nhiều, và bạn sẽ cần các giao diện thử nghiệm được thực hiện theo mục đích.

+1

Có vẻ như ở cấp độ tích hợp mọi người 'làm tốt nhất của nó', hoặc bằng cách làm những gì họ có thể với thư viện mocking hoặc bằng cách thực sự nhấn trường hợp thử nghiệm của dịch vụ/cơ sở dữ liệu.Tôi hiện đang làm việc trên một phần mở rộng Mockito dựa trên Groovy để giúp thử nghiệm tích hợp ít đau đớn hơn một chút. –

7

Để mô phỏng những thứ như cơ sở dữ liệu, dịch vụ web, hệ thống tệp và vv, có thể bạn sẽ muốn cấu trúc lại một chút. Đối với mỗi dịch vụ bên ngoài, bạn nên viết một lớp bao bọc có một phương thức cho mỗi hoạt động mà bạn muốn thực hiện. Mỗi phương thức như vậy không có logic thực tế, nhưng chỉ cần truyền thông số của nó theo cách mà dịch vụ bên ngoài sẽ hiểu và trả về một đối tượng chứa bất kỳ dữ liệu nào mà dịch vụ bên ngoài trả về. Ví dụ, nếu bạn đang tương tác với một cơ sở dữ liệu, lớp trình bao bọc có thể định dạng các tham số của nó thành một câu lệnh SQL, gửi chúng vào một đối tượng Connection hiện có và trả lại kết quả là List.

Bởi vì các phương pháp của lớp bao bọc không chứa logic (nghĩa là, không nếu/else, không có vòng lặp và không xử lý ngoại lệ); không cần phải kiểm tra đơn vị lớp bao bọc.Bạn nên tích hợp kiểm tra lớp bao bọc, để đảm bảo rằng các trách nhiệm của nó được thực hiện đúng (có nghĩa là, câu lệnh SQL có hiệu ứng mong muốn trên cơ sở dữ liệu, ví dụ).

Bây giờ viết lại các lớp tương tác với các dịch vụ bên ngoài để chúng tương tác với các lớp trình bao bọc thay thế. Thật dễ dàng để kiểm tra đơn vị chúng - bạn chỉ cần giả lập các lớp bao bọc.

+0

Cảm ơn David. Các dịch vụ bên ngoài của tôi được trừu tượng hóa khá tốt, được bao bọc bởi một lớp dịch vụ đơn lớp Spring. Ngay cả với điều này, đối với một kịch bản phức tạp, chế giễu trở nên khó khăn. Có rất nhiều dữ liệu cần được stubbed, thường là cùng một phương thức dịch vụ sẽ được gọi nhiều lần có nghĩa là tôi cần phải có nhiều giá trị trả về, sau đó có vấn đề nhận được những người được tiêm Spring. Tôi phải giả định rằng mọi người đã giải quyết vấn đề này một cách rõ ràng hơn –

+0

Họ có phải được bao bọc bằng một singleton không? Singletons nổi tiếng là khó giả. Bạn có thể kỹ sư những thứ để wrapper không phải là một singleton? –

+0

Ngoài ra, tôi sẽ truy vấn tại sao cùng một phương thức dịch vụ được gọi nhiều lần trong một thử nghiệm. Có lẽ phương pháp thử nghiệm của bạn quá lớn? Tôi là một người tin tưởng vững chắc trong quy tắc "một khẳng định cho mỗi phương pháp thử nghiệm"; nó thực sự làm cho nhiều thử nghiệm sạch hơn. –

0

Nếu có một số khung công tác giả lập http hoặc phần còn lại, việc sử dụng đó phải tốt.

Tất cả các phụ thuộc phức tạp có thể được ghi lại, sửa đổi và phát lại.

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