2012-06-28 23 views
9

Tôi đang thu thập dữ liệu và lưu trữ dữ liệu này trong cơ sở dữ liệu MySQL bằng cách sử dụng Java. Ngoài ra, tôi sử dụng Maven để xây dựng dự án, TestNG như một khung kiểm thử và Spring-Jdbc để truy cập cơ sở dữ liệu. Tôi đã triển khai một lớp DAO bao bọc quyền truy cập vào cơ sở dữ liệu. Bên cạnh việc thêm dữ liệu bằng cách sử dụng các lớp DAO tôi muốn thực hiện một số truy vấn tổng hợp dữ liệu và lưu trữ các kết quả trong một số bảng khác (như các khung nhìn vật hoá).Cách thích hợp để kiểm tra mã sử dụng truy vấn cụ thể MySQL trong nội bộ

Bây giờ, tôi muốn viết một số testcases để kiểm tra xem các lớp DAO có hoạt động đúng như chúng không. Vì vậy, tôi đã nghĩ đến việc sử dụng một cơ sở dữ liệu trong bộ nhớ sẽ được phổ biến với một số dữ liệu thử nghiệm. Vì tôi cũng đang sử dụng các truy vấn SQL cụ thể cho MySQL để tổng hợp dữ liệu, tôi đã gặp một số rắc rối:

  1. Thứ nhất, tôi đã nghĩ đơn giản bằng chức năng cơ sở dữ liệu nhúng do Spring-Jdbc cung cấp để khởi tạo cơ sở dữ liệu nhúng . Tôi đã quyết định sử dụng H2. Ở đó, tôi gặp sự cố vì các truy vấn tổng hợp đang sử dụng nội dung cụ thể của MySQL (ví dụ: các hàm thao tác thời gian như DATE()). Một bất lợi của phương pháp này là tôi cần duy trì hai tập tin ddl - tệp ddl thực sự xác định các bảng trong MySQL (ở đây tôi xác định mã hóa và thêm nhận xét vào các bảng và cột, cả hai tính năng đều là MySQL cụ thể); và tệp ddl thử nghiệm xác định cùng một bảng nhưng không có nhận xét, vv vì H2 không hỗ trợ nhận xét.
  2. Tôi đã tìm thấy mô tả để sử dụng MySQL làm cơ sở dữ liệu được nhúng mà tôi có thể sử dụng trong các trường hợp kiểm tra (http://literatitech.blogspot.de/2011/04/embedded-mysql-server-for-junit-testing .html). Điều đó nghe có vẻ thực sự hứa hẹn với tôi. Thật không may, nó đã không làm việc: Một MissingResourceExcpetion xảy ra "Tài nguyên" 5-0-21/Linux-amd64/mysqld 'không tìm thấy ". Dường như trình điều khiển không thể tìm thấy trình nền cơ sở dữ liệu trên máy cục bộ của tôi. Nhưng tôi không biết mình phải tìm kiếm giải pháp nào cho vấn đề đó.

Bây giờ, tôi hơi bị kẹt và tôi tự hỏi liệu tôi có nên tạo kiến ​​trúc khác đi không. Do ai đó có một số lời khuyên làm thế nào tôi nên thiết lập một hệ thống thích hợp? Tôi có hai tùy chọn khác trong đầu:

  1. Thay vì sử dụng cơ sở dữ liệu nhúng, tôi sẽ sử dụng cơ sở dữ liệu MySQL gốc và thiết lập cơ sở dữ liệu chỉ được sử dụng cho testcases. Tùy chọn này nghe chậm. Trên thực tế, tôi có thể muốn thiết lập một máy chủ CI sau này và tôi nghĩ rằng việc sử dụng một cơ sở dữ liệu nhúng sẽ thích hợp hơn kể từ khi chạy thử nghiệm nhanh hơn.
  2. Tôi xóa tất cả nội dung cụ thể của MySQL ra khỏi truy vấn SQL và sử dụng H2 làm cơ sở dữ liệu được nhúng để thử nghiệm. Nếu tùy chọn này là lựa chọn đúng, tôi sẽ cần phải tìm một cách khác để kiểm tra các truy vấn SQL tổng hợp dữ liệu thành các khung nhìn vật chất hóa.
  3. Hoặc có tùy chọn thứ 3 mà tôi không có trong tâm trí không?

Tôi sẽ đánh giá cao bất kỳ gợi ý nào.

Cảm ơn, XComp

Trả lời

2

Nếu nó không phải là tốt để có được cơ sở dữ liệu MySQL trong bộ nhớ để làm việc tôi đề nghị sử dụng cơ sở dữ liệu H2 cho "đơn giản" kiểm tra một trường hợp MySQL chuyên dụng để kiểm tra MySQL- truy vấn cụ thể.

Ngoài ra, các thử nghiệm cho cơ sở dữ liệu MySQL thực có thể được cấu hình làm kiểm tra tích hợp trong một cấu hình maven riêng biệt để chúng không phải là một phần của việc xây dựng maven thông thường. Trên máy chủ CI, bạn có thể tạo thêm công việc chạy các kiểm tra MySQL định kỳ, ví dụ: hàng ngày hoặc vài giờ một lần.Với thiết lập như vậy, bạn có thể giữ và kiểm tra các truy vấn cụ thể cho sản phẩm trong khi quá trình xây dựng thông thường của bạn sẽ không bị chậm lại. Bạn cũng có thể chạy một xây dựng bình thường ngay cả khi cơ sở dữ liệu thử nghiệm không có sẵn.

Có một plugin maven đẹp cho các bài kiểm tra tích hợp được gọi là maven-failsafe-plugin. Nó cung cấp các bước kiểm tra trước và sau tích hợp có thể được sử dụng để thiết lập dữ liệu thử nghiệm trước khi kiểm tra và làm sạch cơ sở dữ liệu sau khi thử nghiệm.

8

Tôi đã tạo plugin Maven chính xác cho mục đích này: jcabi-mysql-maven-plugin. Nó bắt đầu một máy chủ MySQL cục bộ vào giai đoạn pre-integration-test và tắt nó trên post-integration-test.