2013-05-30 27 views
6

Gần đây tôi đã bắt đầu làm freelancer trong dự án hiện tại của mình. Một trong những thứ mà tôi đã tự ném mình vào, là việc xây dựng Jenkins thất bại (nó đã thất bại bắt đầu từ ngày 8 tháng Tư, một tuần trước khi tôi bắt đầu ở đây).Ngữ cảnh mùa xuân bị bẩn sau mỗi lần kiểm tra tích hợp

Nói chung, bạn có thể thấy một loạt các vấn đề DI trong nhật ký. Điều đầu tiên tôi đã làm, đã nhận được tất cả các bài kiểm tra để làm việc trong cùng một cách, bắt đầu từ bối cảnh ứng dụng tương tự. Họ cũng thực hiện điều "nhại" của riêng họ, điều này dường như không hoạt động chính xác. Sau khi thảo luận với người dẫn đầu, tôi đã đề nghị bắt đầu sử dụng Springockito. (đối với một mô-đun nhất định, họ cần chế nhạo để thử nghiệm tích hợp của họ - lý do kế thừa, không thể thay đổi được)

Dù sao thì, công cụ bắt đầu không thành công sau đó. Rất nhiều đậu đã được chế giễu trong thử nghiệm, chỉ đơn giản là không chế giễu, hoặc không được tìm thấy hoặc bất cứ điều gì. Thông thường, nó sẽ thất bại khi tải ngữ cảnh ứng dụng, nói rằng một hoặc một bean khác bị thiếu.

Tôi đã thử các công cụ khác nhau và các cách tiếp cận khác nhau, nhưng cuối cùng, chỉ điều tôi lo sợ nhất sẽ hoạt động: thêm @DirtiesContext vào mọi thử nghiệm đơn lẻ. Bây giờ, việc xây dựng maven đang bắt đầu chuyển sang màu xanh một lần nữa, kiểm tra bắt đầu làm những gì họ có nghĩa vụ phải làm. Nhưng tôi tải lại bối cảnh Spring mỗi lần, mọi thứ đều mất thời gian - tất cả đều là tương đối, vì ngữ cảnh được tải trong khoảng 1 - 2 giây.

Một lưu ý phụ cho câu chuyện này là họ đã nâng cấp lên Hibernate 4 và do đó đến Mùa xuân 3.2. Trước đây, họ đã sử dụng phiên bản cũ của Spring 3. Tất cả các thử nghiệm đều hoạt động trở lại sau đó và điều @DirtiesContext là không cần thiết.

Bây giờ, điều làm tôi lo lắng nhất, là tôi không thể nghĩ ngay về lời giải thích cho hành vi kỳ lạ này. Nó gần như có vẻ như bối cảnh Springs là bẩn, chỉ đơn giản bằng cách tung ra một thử nghiệm trong đó sử dụng @Autowired đậu. Không phải tất cả các bài kiểm tra đều sử dụng Mocks, vì vậy nó không thể như vậy. Âm thanh này có quen thuộc với bất kỳ ai không? Có ai có cùng trải nghiệm với thử nghiệm tích hợp với (phiên bản mới nhất của) Spring không?

Trên Stackoverflow, tôi đã tìm thấy vé này: How can a test 'dirty' a spring application context? Có vẻ như tổng hợp khá nhiều hành vi tôi thấy, nhưng quan trọng là chúng tôi đang tự động dịch vụ/kho/... và rằng chúng tôi không có bất kỳ người định cư nào trên những lớp đó.

Mọi suy nghĩ?

Cảm ơn!

+0

Tôi không sử dụng ngữ cảnh thử nghiệm vào mùa xuân mà cực kỳ (chưa) vì tất cả các bài kiểm tra của tôi không hướng đến ngữ cảnh. Tôi thậm chí không biết rằng thats có thể;) Mùa xuân 3.2, Hibernate 4.2. Nó có thể được rằng có một số postprocessors đá trong? Một số định nghĩa bean đang thay đổi ở giữa hai phần khởi động và autowiring là giải quyết cho đậu mới và do đó dấu bẩn? –

+0

Có thể. Tôi sẽ giữ cho các nhà hậu xử lý trong tâm trí, cảm ơn! Ngay bây giờ, tôi đang cố gắng tìm ra trình tải cho ngữ cảnh. Khi bạn đang sử dụng Springockito, bạn cần có SpringockitoContextLoader.class làm trình tải ngữ cảnh - tuy nhiên, tôi không sử dụng trình tải ngữ cảnh đó ở mọi nơi, có thể là giải thích. Nó sẽ giải thích lý do tại sao mùa xuân không thể tìm thấy một số loại đậu mà khung đã được tải trong một thử nghiệm trước đó. – gjoris

Trả lời

4

Để trả lời câu hỏi của riêng tôi, bí mật nằm trong phiên bản Spring. Chúng tôi đã sử dụng Spring 3.1.3, trong khi tôi cho rằng họ đang sử dụng Spring 3.2 (họ liên tục nói về bản nâng cấp gần đây của phiên bản Spring).

Lời giải thích đã ở đây, một bài viết trên blog tôi vấp trong săn của tôi để làm cho nó cố định: http://blog.springsource.org/2012/11/07/spring-framework-3-2-rc1-new-testing-features/

Và một dán bản sao của mảnh liên quan:

Việc sử dụng phương pháp nhà máy chung trong Cấu hình mùa xuân không có nghĩa là cụ thể để> thử nghiệm, nhưng các phương thức nhà máy chung như EasyMock.createMock (MyService.class) hoặc Mockito.mock (MyService.class) thường được sử dụng để tạo các mocks động cho các bean Spring trong một ngữ cảnh ứng dụng thử nghiệm . Ví dụ, trước Spring Framework 3.2, cấu hình sau đây có thể không tự động lưu trữ OrderRepository vào OrderService. Lý do là>, tùy thuộc vào thứ tự mà bean được khởi tạo trong ngữ cảnh ứng dụng,> Spring có khả năng suy ra loại bean orderRepository là java.lang.Object> thay vì com.example.repository.OrderRepository.

Vì vậy, làm cách nào để giải quyết vấn đề này? Vâng, tôi đã làm theo các bước sau:

  • tạo một module maven mới
  • lọc ra các bài kiểm tra mà cần chế giễu. Tất cả các thử nghiệm không giả lập sẽ chạy bình thường trong một bản xây dựng Spring, trong một Failsafe chạy riêng biệt (tôi tạo ra một gói cơ sở "sạch", và sắp xếp chúng như thế)
  • Đặt tất cả các thử nghiệm giả trong một gói cơ sở được gọi là "chế nhạo", và thực hiện một hoạt động bổ sung trong Failsafe cho các thử nghiệm giả.
  • Mỗi thử nghiệm giả lập đang sử dụng Springockito, để tạo các mock. Tôi cũng đang sử dụng chú thích Springockito, để dễ dàng thực hiện @ReplaceWithMock tại chỗ. Mỗi thử nghiệm giả lập sau đó được chú thích bằng @DirtiesContext, vì vậy ngữ cảnh bị bẩn sau mỗi lần kiểm tra và bối cảnh Mùa xuân được giới thiệu lại với mỗi bài kiểm tra.

Giải thích hợp lý duy nhất mà tôi có thể đưa ra, đó là ngữ cảnh có hiệu quả bị bẩn, vì có một khung công tác (Springockito) đang quản lý các bean Spring từ khung Spring. Tôi không biết nếu đó là chính xác, nhưng đó là lời giải thích tốt nhất tôi có thể đưa ra. Đó là, trên thực tế, là định nghĩa của một bối cảnh bẩn thỉu, đó là lý do tại sao chúng ta cần phải gắn cờ nó là bẩn.

Sử dụng chiến lược này, tôi đã xây dựng và chạy lại, và tất cả các thử nghiệm đang chạy ok. Nó không hoàn hảo, nhưng nó hoạt động, và nó nhất quán.