2009-01-06 33 views
6

Tôi đang cố gắng bắt đầu một dự án MVC mới với các bài kiểm tra và tôi nghĩ cách tốt nhất để đi sẽ có 2 cơ sở dữ liệu. 1 để thử nghiệm chống lại và 1 cho khi tôi chạy các ứng dụng và sử dụng nó (cũng kiểm tra thực sự vì nó không phải sản xuất nào được nêu ra).ASP.NET MVC TDD với cơ sở dữ liệu LINQ và SQL

Đối với cơ sở dữ liệu thử nghiệm, tôi đã nghĩ đến việc tạo các kịch bản lệnh bảng và điền các tập lệnh dữ liệu trong phương pháp thiết lập thử nghiệm và sau đó xóa tất cả điều này trong phương thức xé.

Tôi sẽ sử dụng LINQ to SQL và tôi không nghĩ điều đó sẽ cho phép tôi thực hiện việc này?

Tôi có phải đi tuyến đường ADO không nếu tôi muốn thực hiện theo cách này? Hoặc tôi chỉ nên sử dụng một đối tượng giả và lưu trữ dữ liệu dưới dạng mảng hay gì đó ?.

Bất kỳ mẹo nào về thực tiễn tốt nhất?

Jeff đã làm thế nào để thực hiện việc này cho StackOveflow?

Trả lời

2

Tôi đã kiểm tra liên kết từ tvanfosson và RikMigrations và sau khi chơi với chúng, tôi thích phương pháp datacontext mocking tốt nhất. Tôi nhận ra rằng tôi không cần phải tạo ra các bảng và thả chúng mọi lúc.

Sau một ít nghiên cứu, tôi đã tìm thấy bài viết của Stephen Walther http://stephenwalther.com/blog/archive/2008/08/17/asp-net-mvc-tip-33-unit-test-linq-to-sql.aspx mà với tôi có vẻ dễ dàng hơn và đáng tin cậy hơn.

Vì vậy, tôi sẽ thực hiện việc này.

Cảm ơn sự giúp đỡ.

4

Điều tôi làm là xác định giao diện cho trình bao bọc DataContext và sử dụng triển khai trình bao bọc cho DataContext. Điều này cho phép tôi sử dụng một thay thế DataContext giả, thay thế trong các bài kiểm tra của tôi (hoặc giả lập nó, nếu dễ dàng hơn). Điều này tóm tắt cơ sở dữ liệu trong các bài kiểm tra đơn vị của tôi hoàn toàn. Tôi tìm thấy một số mã starter tại http://andrewtokeley.net/archive/2008/07/06/mocking-linq-to-sql-datacontext.aspx, mặc dù tôi đã mở rộng nó để nó xử lý việc triển khai xác thực trên các lớp thực thể của tôi.

Tôi cũng nên đề cập rằng tôi có một máy chủ phân đoạn riêng cho QA, do đó, có thử nghiệm trực tiếp toàn bộ hệ thống. Tôi chỉ không sử dụng một cơ sở dữ liệu thực tế trong thử nghiệm đơn vị của tôi.

+0

Tôi sử dụng cùng một đoạn mã dữ liệu mocking và nó hoạt động độc đáo –

1

Bạn có thể muốn tìm một số cách khác xung quanh thực sự nhấn cơ sở dữ liệu cho các bài kiểm tra đơn vị của bạn bởi vì phải mất rất nhiều thời gian hơn. Điều đó đang được nói, bạn có cân nhắc sử dụng Migrations để tạo/xóa các bảng của bạn thay vì sử dụng các tập lệnh sql không? RikMigrations là những gì tôi đã sử dụng để tạo cơ sở dữ liệu của mình để tôi có thể dễ dàng sửa đổi tất cả mã của mình ở một nơi. Justin Etheredge có một bài viết tuyệt vời trên using RikMigrations.

1

Tôi đồng ý với phần lớn ở trên, liên quan đến kiểm tra đơn vị. Tuy nhiên, tôi nghĩ rằng điều quan trọng là nâng cao điểm mà sử dụng kho lưu trữ Mock và kiểm tra đơn vị không cung cấp cho bạn cùng một mức độ kiểm tra như một thử nghiệm tích hợp DB sẽ.

Ví dụ: cơ sở dữ liệu của chúng tôi thường có các lần xóa tầng được tạo ngay trong lược đồ. Trong trường hợp này, việc xóa một thực thể chính trong tổng hợp sẽ tự động xóa tất cả các thực thể con. Tuy nhiên, điều này sẽ không tự động áp dụng trong kho lưu trữ giả mạo mà không được sao lưu bởi cơ sở dữ liệu vật lý với các quy tắc kinh doanh này (trừ khi bạn xây dựng tất cả các quy tắc đó vào Mock). Điều này là quan trọng bởi vì nếu ai đó đến và thay đổi thiết kế của lược đồ của tôi, tôi cần nó để phá vỡ các bài kiểm tra của tôi để tôi có thể điều chỉnh mã/lược đồ cho phù hợp. Tôi đánh giá cao đây là Kiểm thử Tích hợp chứ không phải Kiểm thử Đơn vị nhưng nghĩ rằng nó đáng được nhắc đến.

Tùy chọn ưa thích của tôi là tạo Cơ sở dữ liệu thiết kế chính chứa dữ liệu mẫu (cùng loại dữ liệu bạn tạo trong Mocks). Trong khi bắt đầu mỗi lần chạy thử nghiệm, tôi có một kịch bản lệnh tự động tạo bản sao lưu của MasterDB và khôi phục nó thành "TestDB" (tất cả các thử nghiệm của tôi đều sử dụng). Bằng cách đó, tôi duy trì một kho dữ liệu thử nghiệm sạch trong Master hơn là tái tạo chính nó sau mỗi lần chạy thử nghiệm. Các thử nghiệm của tôi có thể phát xung quanh với dữ liệu và kiểm tra tất cả các tình huống cần thiết.

Khi tôi gỡ lỗi ứng dụng, tôi có một tập lệnh khác sao lưu và khôi phục DB chính thành cơ sở dữ liệu DEV. Tôi có thể chơi xung quanh với dữ liệu ở đây mà không lo lắng về việc mất dữ liệu mẫu của tôi. Tôi thường không chạy tập lệnh cụ thể này mỗi phiên vì sự chậm trễ chờ DB được tạo lại. Tôi có thể chạy nó một lần một ngày và sau đó chơi xung quanh/gỡ lỗi các ứng dụng trong suốt cả ngày. Ví dụ, nếu tôi xóa tất cả các bản ghi từ một bảng như là một phần của quá trình gỡ lỗi, tôi sẽ chạy tập lệnh để tạo lại DevDB khi tôi hoàn thành.

Các bước này nghe có vẻ như họ sẽ thêm một lượng thời gian rất lớn vào quy trình, nhưng thực tế - chúng không. Ứng dụng của chúng tôi hiện có trong phạm vi 3500 thử nghiệm, với khoảng 3000 người trong số họ truy cập vào DB tại một số điểm. Sao lưu và phục hồi cơ sở dữ liệu thường mất khoảng 10-12 giây khi bắt đầu mỗi lần chạy thử. Và vì toàn bộ bộ thử nghiệm chỉ được thực hiện khi kiểm tra TFS, chúng tôi không bận tâm nếu chúng ta phải đợi lâu hơn nữa. Vào một ngày trung bình, toàn bộ bộ thử nghiệm của chúng tôi mất khoảng 15-20 phút để chạy.

Tôi đánh giá cao và chấp nhận thử nghiệm tích hợp chậm hơn nhiều so với kiểm tra đơn vị (vì nhu cầu vốn có để sử dụng DB thực) nhưng nó đại diện cho ứng dụng 'thế giới thực' chặt chẽ hơn. Ví dụ: Kho lưu trữ Mock không trả lại mã lỗi DB, không hết thời gian chờ, chúng không bị khóa, chúng không hết dung lượng đĩa, v.v.

Kiểm tra đơn vị là ok cho đơn giản tính toán, quy tắc kinh doanh cơ bản, vv và chắc chắn chúng hoàn toàn là lựa chọn tốt nhất cho hầu hết các hoạt động không liên quan đến truy cập DB (hoặc tài nguyên khác). Nhưng tôi không nghĩ rằng chúng có giá trị như các bài kiểm tra tích hợp - mọi người nói rất nhiều về các bài kiểm tra đơn vị, nhưng ít được nói về các bài kiểm tra tích hợp.

Tôi mong rằng những người đam mê thử nghiệm đơn vị sẽ gửi lửa theo cách của tôi cho việc này. Đó là tốt - Tôi chỉ cố gắng để mang lại một số cân bằng và để nhắc nhở mọi người rằng các dự án có đầy đủ các bài kiểm tra đơn vị thông qua vẫn có thể thất bại nặng nề khi bạn thực hiện chúng trong lĩnh vực này.

+0

thú vị, nhưng chắc chắn tắt trên một ốp .. cộng với các chữ cái TFS đã gửi một rùng mình xuống cột sống của tôi! – Lloyd

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