2008-12-01 32 views
8

Dường như với tôi rằng hầu hết mọi người viết bài kiểm tra của họ chống lại trong bộ nhớ, trong cơ sở dữ liệu quá trình như SQLite khi làm việc với NHibernate. Tôi có điều này và chạy nhưng thử nghiệm đầu tiên của tôi (sử dụng NHibernate) luôn luôn mất từ ​​3-4 giây để thực thi. Bài kiểm tra tiếp theo chạy nhanh hơn nhiều.Làm cách nào để thực hiện TDD hiệu quả với NHibernate?

Tôi đang sử dụng FluentNhibernate để thực hiện ánh xạ nhưng nhận được cùng khoảng thời gian với các tệp ánh xạ XML. Đối với tôi, sự trì hoãn 3-4 giây làm gián đoạn nghiêm trọng dòng chảy của tôi.

Cách được khuyến nghị làm việc với TDD và NHibernate là gì?

Có thể giả lập ISession đến đơn vị kiểm tra các truy vấn thực tế hoặc chỉ có thể thực hiện điều này trong cơ sở dữ liệu bộ nhớ?

+0

Điều này càng trở nên phù hợp hơn khi thử nghiệm mất 3-4 phút để chạy. – bentford

Trả lời

14

Tôi đang sử dụng Mẫu lưu trữ để thực hiện các thao tác Cơ sở dữ liệu, và bất cứ khi nào tôi chạy Thử nghiệm, tôi chỉ chạy các thử nghiệm ở mức cao hơn, chỉ đơn giản là Mock Kho lưu trữ (với RhinoMocks).

Tôi có một bộ thử nghiệm riêng biệt kiểm tra rõ ràng lớp Bản đồ và ánh xạ NHibernate. Và những thứ đó thường không thay đổi nhiều như logic kinh doanh và gui ở trên chúng.

Bằng cách đó tôi nhận được unittests rất nhanh mà không bao giờ nhấn DB, và vẫn còn một DB lớp cũng được thử nghiệm

+1

Tuy nhiên, các thử nghiệm riêng biệt đó cũng nằm trong lĩnh vực kiểm tra tích hợp. Tốt đẹp là bạn có thể tự động hóa chúng nhưng tốt nhất là giữ chúng riêng biệt.^1 – Mendelt

+0

Vâng, nhibernate làm cho nó rất dễ dàng để làm những bài kiểm tra bằng cách có cơ sở dữ liệu tái tạo mỗi khi bạn bắt đầu một bài kiểm tra. Điều đó mất thời gian và NHibernate thử nghiệm của tôi mất khoảng một phút để chạy, nhưng vẫn còn, họ chạy và tôi biết khi mọi thứ không hoạt động. – Tigraine

+0

làm thế nào về phương pháp thử nghiệm yêu cầu dữ liệu truy vấn hoặc lưu hoạt động yêu cầu chìa khóa nước ngoài vv tôi có thể tưởng tượng nó rất nhiều công việc để tải dữ liệu để thử nghiệm –

0

Bạn đã cố gắng thay đổi một số thiết lập mặc định trong các thuộc tính cấu hình tùy chọn? Sự chậm lại có nhiều khả năng liên quan đến tối ưu hóa nhất định nhibernate không với việc tạo mã.

http://nhibernate.info/doc/nh/en/index.html#configuration-optional

Nó có vẻ như một trong bộ nhớ db sẽ là cách nhanh nhất để thử nghiệm một lớp dữ liệu của bạn. Nó cũng có vẻ như một khi bạn bắt đầu thử nghiệm lớp dữ liệu của bạn, bạn đang di chuyển một chút ngoài phạm vi của một bài kiểm tra đơn vị.

4

Unit truy cập thử nghiệm dữ liệu là không thể, nhưng bạn có thể thử nghiệm tích hợp nó. Tôi tạo kiểm tra tích hợp để truy cập dữ liệu của mình trong một dự án riêng biệt từ các thử nghiệm đơn vị của mình. Tôi chỉ chạy thử nghiệm tích hợp (chậm) khi tôi thay đổi một cái gì đó trong kho, lập bản đồ hoặc lược đồ cơ sở dữ liệu. Bởi vì các bài kiểm tra tích hợp không được trộn lẫn với các bài kiểm tra đơn vị, tôi vẫn có thể chạy các bài kiểm tra đơn vị khoảng 100 lần một ngày mà không bị khó chịu.

+0

Tôi không chắc chắn bạn là chính xác về điều đó. Nó thực sự phụ thuộc vào CÁCH bạn viết các bài kiểm tra. Nếu các thử nghiệm của bạn là Atomic, Order indepenent và bị cô lập, Intention Revealing, Easy to setup và Fast. Họ đang ở trong mọi cảm giác UnitTests. Xem: http://codebetter.com/blogs/jeremy.miller/archive/2005/07/20/129552.aspx – maz

+0

Một số kiểm tra tương tác với hệ thống tệp, cơ sở dữ liệu hoặc bất kỳ hệ thống nào khác không độc lập, do đó, không phải kiểm tra đơn vị. Tôi biết J.Miller đồng ý với điều đó. Với tốc độ nhanh có nghĩa là có thể chạy thử nghiệm trong 10 giây. Dù bạn làm gì, bạn sẽ không đạt được tốc độ đó với các bài kiểm tra tích hợp db. – Paco

+0

Có, tôi đồng ý rằng "... kiểm tra tương tác với hệ thống tệp, cơ sở dữ liệu hoặc bất kỳ hệ thống nào khác không độc lập ..." nhưng những gì tôi đang nói ở đây là chạy trên một bộ nhớ, trong bộ nhớ db. Điều này không khác với bất kỳ đối tượng trong bộ nhớ nào khác mà bạn có thể có trong các bài kiểm tra của mình hôm nay. – maz

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