2009-02-14 36 views
5

Tôi muốn triển khai thử nghiệm tự động, sử dụng khung kiểm tra của Microsoft trong Visual Studio, cho các dự án phát triển phần mềm của tôi. Tôi đã tạo ra một số thử nghiệm, và tất cả trong tất cả, nó khá dễ sử dụng.Bạn kiểm tra đối tượng kinh doanh của mình như thế nào?

Một số thực hành tốt nhất là thực hiện tốt hơn cho các đối tượng kinh doanh thử nghiệm, cụ thể hơn là đọc và ghi vào cơ sở dữ liệu. Có phải là tốt nhất để thiết lập một cơ sở dữ liệu thử nghiệm riêng biệt, từ cơ sở dữ liệu phát triển, nơi mà giao diện người dùng được kiểm tra từ, và chỉ kiểm tra đối với cơ sở dữ liệu đó không? Không. Về cơ bản chỉ cần điền nó với dữ liệu rác.

Tốt hơn là nên nắm lấy một số loại dọn dẹp sau khi bạn có tâm lý, có nghĩa là, nếu tôi đang thử nghiệm phương pháp AddUser, tôi có thêm Người dùng, kiểm tra bài kiểm tra của tôi và sau đó xóa Người dùng không?

Bạn có kiểm tra từng phương pháp CRUD trong một phương pháp thử nghiệm không?

Cuối cùng, quy tắc kinh doanh riêng lẻ như xác minh chuỗi có kích thước chính xác, ngày bắt đầu nhỏ hơn ngày kết thúc, CustomerId là Khách hàng chính xác, v.v.

Tôi nhận ra đây là một câu hỏi khá rộng ... chỉ cần tìm một số hướng ... thực hiện các bước của em bé.

thêm thông tin ...

lô của câu trả lời tốt! Tôi không chắc tôi có thể lấy ra một cơ sở dữ liệu giả được không. Tôi đang sử dụng CSLA làm khuôn khổ cho các đối tượng của tôi. Nó sẽ mất một số refactoring nghiêm trọng để làm cho testable với các đối tượng giả. Tôi sẽ xem xét điều này. Mặc dù, tại một số thời điểm, tôi làm muốn kiểm tra tương tác cơ sở dữ liệu ... khi sử dụng cơ sở dữ liệu giả, trong đó/khi nào bạn thực sự sẽ kiểm tra giao tiếp cơ sở dữ liệu?

Một câu hỏi khác ... tốt nhất là giữ cho mỗi phương pháp thử nghiệm không phụ thuộc vào các thử nghiệm khác?

+0

Tìm thấy một số quy tắc chung của ngón tay cái tại đây http://msdn.microsoft.com/en-us/library/ms379625 (VS.80).aspx. Đồng ý với rất nhiều điều mọi người đang nói. – mattruma

Trả lời

8

Lý tưởng nhất là bạn sẽ có các đối tượng nghiệp vụ không truy cập trực tiếp vào cơ sở dữ liệu, nhưng sử dụng các đối tượng trợ giúp hoặc một số khung ORM (ánh xạ đối tượng-quan hệ). Sau đó, bạn có thể kiểm tra BO của bạn mà không có một cơ sở dữ liệu, có thể chế nhạo một số đối tượng trợ giúp. Đó có lẽ là cách sạch nhất, bởi vì bạn tránh sự phức tạp của một DB thực sự, và thực sự chỉ kiểm tra logic nghiệp vụ của bạn.

Nếu bạn không thể tránh kết hợp các quy tắc kinh doanh và truy nhập DB vào một lớp (có thể là một thiết kế có vấn đề, nhưng đôi khi khó tránh), thì bạn phải kiểm tra DB.

Có khá nhiều lựa chọn hợp lý duy nhất là có một DB riêng để kiểm tra tự động. Các phương pháp thử nghiệm của bạn sẽ xóa mọi thứ khi thiết lập trên thiết lập, sau đó tải tất cả dữ liệu của chúng, thực hiện kiểm tra và xác minh kết quả.

Đừng nghĩ đến việc thử khởi chạy DB một lần và sau đó chạy tất cả các thử nghiệm trên cùng một dữ liệu. Một thử nghiệm sẽ vô tình thay đổi dữ liệu và các thử nghiệm khác sẽ thất bại một cách bí ẩn. Tôi đã làm điều đó và hối hận về nó ... Mỗi thử nghiệm thực sự phải tự đứng vững.

Để thực hiện tất cả điều này, tôi thực sự khuyên bạn nên sử dụng một số loại khung kiểm tra DB. Những điều này giúp bạn làm sạch DB, tải dữ liệu cần thiết và so sánh truy vấn kết quả với kết quả mong đợi. Tôi sử dụng DBUnit (cho Java), nhưng có nhiều thứ khác cho các ngôn ngữ khác.

+0

Cảm ơn! Một số khung kiểm tra DB là gì? Hay đây là thứ mà bạn tự xây dựng? – mattruma

+0

Không, vấn đề là sử dụng một khung công tác hiện có. Tôi sử dụng DBUnit, http://www.dbunit.org, nhưng có những người khác. Chỉ cần google cho "cơ sở dữ liệu thử nghiệm đơn vị". – sleske

1

Nói chung tôi tạo BO, lưu nó vào db trong thiết lập lịch thi đấu, sau đó có các thử nghiệm để chèn/cập nhật/lựa chọn khác nhau trong teardown của tôi xóa đối tượng từ cơ sở dữ liệu. Nó giữ mọi thứ tốt đẹp và sạch sẽ, đặc biệt là khi có nhiều ràng buộc, db thử nghiệm của bạn có thể nhanh chóng thực sự lộn xộn nếu bạn không xóa mọi thứ bạn tạo ra trong các thử nghiệm của mình.

5

Tôi khuyên bạn nên triển khai đối tượng kinh doanh của mình để họ không biết về cơ sở dữ liệu. Sử dụng các phương thức trên lớp truy cập dữ liệu có thể lưu/lấy các đối tượng nghiệp vụ một cách chính xác tùy thuộc vào loại của chúng (nghĩa là nó có một ánh xạ nội bộ giữa các bảng và các đối tượng mà chúng tương ứng). Khi thử nghiệm đối tượng kinh doanh của bạn, bạn không cần phải lo lắng về cơ sở dữ liệu. Đơn giản chỉ cần tạo đối tượng, có lẽ sử dụng sự phản chiếu để thiết lập các trường riêng và tiến hành kiểm tra của bạn trên đối tượng.

Khi thử nghiệm mã cần tương tác với lớp truy cập dữ liệu, hãy sử dụng chế độ nhạo để tạo lớp dữ liệu giả và thiết lập kỳ vọng trên lớp đó để trả về đối tượng mong muốn hoặc phản hồi đúng cách để lưu. Bạn có thể cần phải phát triển lớp dữ liệu của mình thành một giao diện (hoặc kết hợp nó với một lớp có khả năng giả lập nếu sử dụng một khung cứng nhắc không hỗ trợ chế nhạo trực tiếp). Hầu hết các khuôn khổ mocking yêu cầu các phương thức là ảo để cho phép thực thi mô hình được tạo ra. Sử dụng các giao diện buộc các phương thức trong lớp thực hiện là ảo nên việc nhạo báng dễ dàng hơn nhiều.

+0

Cảm ơn! Điều này nghe có vẻ tốt, nhưng âm thanh như rất nhiều công việc. Tôi đang sử dụng khung CSLA cho các đối tượng kinh doanh của tôi, không chắc chắn chính xác điều này sẽ dịch như thế nào. – mattruma

2

Sử dụng dependency injection. Thực hiện các phương thức cơ sở dữ liệu của bạn trong một giao diện. Sau đó viết một triển khai mới của giao diện với dữ liệu điều khiển để kiểm tra các kịch bản có thể áp dụng.

+0

Cảm ơn! Tôi đang sử dụng CSLA như khung ứng dụng của tôi, mà dường như không thân thiện với DI. Tôi rất thích làm điều này! – mattruma

1

Để kiểm tra Lớp truy cập DB, bạn không nên chạy tất cả các thử nghiệm trên cùng một db. Một số xét nghiệm có thể thất bại vì chúng phụ thuộc vào kết quả của thử nghiệm khác. Vì vậy, đây không phải là những gì bạn muốn. Trên thực tế sau mỗi lần kiểm tra, bạn nên trả lại trạng thái db về trạng thái ban đầu trước khi chạy thử nghiệm.

Trong thực tế, tôi giữ dữ liệu thử nghiệm được đặt trong XML và trước mỗi thử nghiệm, nó thiết lập dữ liệu trong db bằng cách sử dụng XML. Vì vậy, mọi thử nghiệm đều chạy với một số tập dữ liệu.

1

Tôi hỗ trợ một lần nói rằng bạn nên kiểm tra bạn các đối tượng kinh doanh với một cơ sở dữ liệu đã được chọn. Trong một số trường hợp, bạn có thể muốn dữ liệu của mình vẫn tồn tại như một phần của thử nghiệm. Những hạn chế đối với điều này là các thử nghiệm chạy dài hơn và nhu cầu dọn dẹp.

Một giải pháp cho điều này có thể giúp bạn là sử dụng cơ sở dữ liệu trong bộ nhớ trong bộ nhớ để kiểm tra. Ví dụ, SQLite cho phép bạn tạo cơ sở dữ liệu trong bộ nhớ, và khi bạn vứt bỏ chúng, chúng sẽ biến mất. Điều này làm cho các bài kiểm tra của bạn nhanh hơn nhiều và bạn không phải thiết lập mã dọn dẹp - trong khi bạn thực sự có thể kiểm tra mã SQL/db của mình thông qua các kiểm tra tự động.

0

(Tôi biết bạn không sử dụng Java nhưng chiến lược chung dưới đây không phụ thuộc vào Java tại tất cả)

Tôi đang làm việc trên một dự án Java sử dụng rất nhiều EJB3 mã/JPA. Tôi quyết định tạo một loại container giả có thể "triển khai" các EJB và sử dụng cơ sở dữ liệu trong bộ nhớ (HSQL) với trình quản lý thực thể ngủ đông.

"Vùng chứa" này khởi động trong chưa đầy 1 giây và cho phép tôi kiểm tra hầu hết các thành phần kinh doanh, kể cả các thành phần truy cập cơ sở dữ liệu qua JPA. Nếu một dịch vụ là, ví dụ, quá phức tạp để hỗ trợ sau đó tôi chỉ đơn giản là sử dụng EasyMock (hoặc bất kỳ thư viện giả khác) để tạo ra một dịch vụ giả mạo và cắm vào "container".

Đó là một thành công lớn cho đến nay, nhưng yêu cầu tôi một vài ngày để triển khai cơ sở hạ tầng giả.

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