Một số thực hành tốt nhất để cư trú và sử dụng cơ sở dữ liệu thử nghiệm là gì?


8

Vì vậy, tôi đang phát triển một số dịch vụ web Java RESTful dựa trên cơ sở dữ liệu, sử dụng Hibernate và MySQL. Đối với mục đích thử nghiệm, tôi đang sử dụng cơ sở dữ liệu trong bộ nhớ H2. H2 là tốt đẹp và nhanh chóng, vì vậy điều này đã làm việc thực sự tốt. Vấn đề duy nhất là việc điền vào các bảng DB trước các thử nghiệm của tôi là khá tẻ nhạt. Về cơ bản tôi tạo và duy trì một loạt các đối tượng bằng tay. Tôi tự hỏi nếu có thể tôi đang đi sai đường.

Xin vui lòng cho tôi biết, những thực tiễn tốt nhất để làm những gì tôi đang cố gắng làm là gì? Bất kỳ công cụ có thể giúp tôi? Bất kỳ chiến lược chung hoặc lời khuyên?

Câu trả lời:


4

Tôi sẽ giả định rằng bạn đã thiết kế API của mình để bạn có thể DI chi tiết DB của mình, nếu không thì chúng tôi có thể giúp bạn vượt qua điều đó.

Về thuật ngữ, bạn muốn sử dụng Fake Test Double . Trong trường hợp cụ thể này, tôi khuyên bạn nên sử dụng cùng DB (H2) trong bộ nhớ, nhưng sử dụng DBUnit để làm việc với JUnit để tạo các bảng của bạn, điền chúng trước mỗi thử nghiệm, cắt ngắn dữ liệu sau mỗi thử nghiệm và cuối cùng các bảng sau khi TestSuite của bạn kết thúc.

Có những giải pháp khác như Grails và Spring Roo tạo ra một số dữ liệu thử nghiệm cho bạn, nhưng DBUnit sẽ xử lý cho bạn ngay bây giờ.


+1 cho DBUnit. Làm cho đơn vị kiểm tra mã DB trở nên dễ chịu hơn nhiều.
TMN

Thật tuyệt - Tôi chắc chắn sẽ kiểm tra xem. Ngay bây giờ, tôi đang bảo Hibernate tự động tạo các bảng, sử dụng thuộc tính hibernate.hbm2ddl.auto = tạo-thả. Nó sẽ hoạt động với DBUnit, hay tôi nên ngừng làm việc này?
sangfroid

Nó sẽ hoạt động với nó có - thực tế, một trong những cách để bắt chước DBUnit là chỉ cần chèn dữ liệu dưới dạng POJO thông qua Hibernate
Martijn Verburg

Tuyệt vời! Được rồi, tôi sẽ kiểm tra điều này.
sangfroid

Ngoài ra, có cần thiết phải sử dụng DI cho việc này? Ngay bây giờ tôi có một tệp tin bền vững trong thư mục / main / resource / META-INF chỉ định máy chủ DB chính thức của tôi và một tệp constance.xml trong thư mục / test / resource / META-INF chỉ định H2. Điều này dường như làm việc thực sự tốt. Nói chung, tôi cực kỳ bối rối 100% về mùa xuân - Tôi chưa bao giờ sử dụng nó trước đây và không hiểu làm thế nào nó có thể giúp tôi ở đây, mặc dù mọi người nói tôi nên sử dụng nó.
sangfroid

1

Có lẽ bạn sẽ được hưởng lợi bằng cách sử dụng một khung mô phỏng trong các bài kiểm tra đơn vị tự động của bạn?

Có một số loại khác nhau để lựa chọn:


Có, tôi đã sử dụng Mockito cho các bài kiểm tra đơn vị. Nhưng tôi cũng muốn làm các bài kiểm tra (tích hợp?) Tiếp cận với DB.
sangfroid

+1 để đề xuất khung mô phỏng trên các giải pháp cơ sở dữ liệu. Cách tiếp cận cơ sở dữ liệu giới thiệu sự phức tạp không cần thiết thường xuyên, chủ yếu kết thúc việc thử nghiệm Hibernate thay vì DAO của bạn. Ngoài ra, tôi sẽ thêm JMockit trong danh sách đó - nó làm mọi thứ . Chuỗi bất biến? Tôi không nghĩ vậy.
Gary Rowe

1
Chà, tôi nên đề cập rằng tôi mới đến Hibernate. Vì vậy, điều thực sự quan trọng đối với tôi là kiểm tra xem tôi đã thực hiện đúng tất cả những thứ ngủ đông của mình chưa. Ngoài ra, có vẻ như rất nhiều hoạt động không thể được thử nghiệm với một khung mô phỏng. Ví dụ, bạn có một phương thức trả về một loạt các bản ghi. Làm thế nào bạn có thể kiểm tra phương thức đó thực sự trả về một loạt các bản ghi nếu bạn không có cơ sở dữ liệu để nó chạy theo?
sangfroid

@sangfroid, Đây là một điểm tốt và tôi cũng có thể hưởng lợi từ điều đó. Các truy vấn logic Hibernate và HQL đặc biệt không kiểm tra đơn vị tốt theo nghĩa truyền thống. Trước đây tôi đã phụ thuộc vào các thử nghiệm đơn vị tích hợp để xác minh chức năng nhưng chúng hầu như luôn luôn là môi trường cụ thể và dễ vỡ. DBUnit đã được đề cập trong một câu trả lời trước đó và có vẻ như nó xứng đáng với cái nhìn thứ hai.
maple_shaft

1

Tất cả những gì bạn thực sự có thể làm là duy trì các đối tượng bằng tay hoặc có một cơ sở dữ liệu dựng sẵn mà bạn tải. Bạn cũng cần đảm bảo rằng cơ sở dữ liệu được thiết lập lại sau mỗi lần kiểm tra.

Trong một dự án tôi đang làm việc với tôi là người mới của Hibernate vì vậy tôi có một loạt các thử nghiệm cho các hoạt động quan hệ và xếp tầng cơ bản. Sử dụng TestNG tôi có một GenericHbTestlớp mà tất cả các bài kiểm tra Hibernate đều mở rộng từ đó. Nó có một @BeforeMethodphương thức tái xuất lược đồ db và một vài phương thức tiện ích để tạo các đối tượng DAO khác nhau. Điều này cho phép tôi điều chỉnh một môi trường cho mỗi bài kiểm tra.

Nhược điểm duy nhất để tái xuất lược đồ mỗi thử nghiệm là phải mất một thời gian rất dài để hoàn thành các thử nghiệm đang chạy. Nhưng tôi chỉ cần chắc chắn rằng mọi thứ đều riêng biệt và sạch sẽ. Nếu bạn có nhiều kinh nghiệm hơn với Hibernate và có một lược đồ ổn định hơn thì việc xuất lại trước mỗi thử nghiệm có thể là không cần thiết. Ít nhất là mặc dù xóa tất cả các bảng trước


1

Bạn đã xem xét tuần tự hóa đối tượng? Đây là phương pháp nhanh nhất và dễ nhất mà tôi đã sử dụng.

Nó bao gồm việc tạo trạng thái bạn muốn, tuần tự hóa nó vào đĩa. Bạn sử dụng các tệp đó để điền vào cơ sở dữ liệu trong bộ nhớ mà bạn sử dụng cho các bài kiểm tra của mình.

Một trong những lợi thế là bạn có thể chỉnh sửa các tệp theo cách thủ công sau này.

Thay vào đó, nếu bạn được tổ chức tốt trong các bài kiểm tra đơn vị của mình, bạn có thể tạo các trình tạo đối tượng. Khi các kiểm tra bắt đầu cơ sở dữ liệu được khởi tạo và lược đồ được xuất (sử dụng nHibernate). Các đối tượng được tạo và điền vào cơ sở dữ liệu.

Phương pháp này có một lợi thế so với phương pháp đầu tiên: trình tạo đối tượng của bạn phát triển cùng với mã của bạn, vì vậy bạn không cần phải lo lắng về các tệp của mình như trong đề xuất trước.


+1 cho một cách tiếp cận thú vị, nhưng nó có thể hơi mong manh.
Gary Rowe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.