2008-08-05 35 views
41

Là một người mới trong thực hành phát triển theo hướng thử nghiệm, tôi thường kết thúc trong một tình trạng khó khăn như thế nào để đơn vị kiểm tra sự bền bỉ cho một cơ sở dữ liệu.Tôi làm cách nào để kiểm tra tính bền vững của đơn vị?

Tôi biết rằng kỹ thuật này sẽ là một thử nghiệm hội nhập (không phải là một bài kiểm tra đơn vị), nhưng tôi muốn tìm hiểu những chiến lược tốt nhất cho những điều sau đây:

  1. truy vấn kiểm tra.
  2. Chèn thử nghiệm. Làm thế nào để tôi biết rằng chèn đã sai nếu nó không thành công? Tôi có thể kiểm tra nó bằng cách chèn và sau đó truy vấn, nhưng làm thế nào tôi có thể biết rằng truy vấn không sai?
  3. Kiểm tra cập nhật và xóa - giống như chèn thử nghiệm

Thực tiễn tốt nhất để thực hiện những việc này là gì?


Về kiểm tra SQL: Tôi biết rằng điều này có thể được thực hiện, nhưng nếu tôi sử dụng một Mapper O/R như NHibernate, nó gắn một số mụn cóc đặt tên trong các bí danh dùng cho các truy vấn đầu ra, và vì đó là không thể đoán trước tôi không chắc tôi có thể kiểm tra điều đó.

Tôi có nên từ bỏ mọi thứ và chỉ cần tin tưởng NHibernate? Tôi không chắc đó là thận trọng.

Trả lời

16

Nhìn vào đơn vị DB. Nó là một thư viện Java, nhưng phải có một tương đương C#. Nó cho phép bạn chuẩn bị cơ sở dữ liệu với một bộ dữ liệu để bạn biết những gì có trong cơ sở dữ liệu, sau đó bạn có thể giao diện với DB Unit để xem những gì có trong cơ sở dữ liệu. Nó có thể chạy với nhiều hệ thống cơ sở dữ liệu, vì vậy bạn có thể sử dụng thiết lập cơ sở dữ liệu thực tế của bạn, hoặc sử dụng cái gì khác, như HSQL trong Java (một cơ sở dữ liệu Java thực hiện với một tùy chọn bộ nhớ).

Nếu bạn muốn kiểm tra xem mã của bạn có đang sử dụng cơ sở dữ liệu đúng không (bạn có nhiều khả năng sẽ làm), thì đây là cách để tách riêng từng thử nghiệm và đảm bảo cơ sở dữ liệu đã chuẩn bị dữ liệu.

4

Bạn thực hiện kiểm tra đơn vị bằng cách bỏ qua kết nối cơ sở dữ liệu. Bằng cách này, bạn có thể xây dựng các kịch bản trong đó các truy vấn cụ thể trong luồng của một cuộc gọi phương thức thành công hoặc thất bại. Tôi thường xây dựng các kỳ vọng giả tạo của mình để văn bản truy vấn thực sự bị bỏ qua, bởi vì tôi thực sự muốn kiểm tra khả năng chịu lỗi của phương thức và cách nó xử lý chính nó - các chi tiết cụ thể của SQL không liên quan đến kết thúc đó.

Rõ ràng điều này có nghĩa là kiểm tra của bạn sẽ không thực sự xác minh rằng phương pháp hoạt động, bởi vì SQL có thể sai. Đây là nơi thử nghiệm tích hợp bắt đầu. Vì điều đó, tôi hy vọng một người khác sẽ có một câu trả lời kỹ lưỡng hơn, vì tôi chỉ mới bắt đầu hiểu thấu những người đó.

1

Tôi cũng sẽ thử cơ sở dữ liệu và kiểm tra xem các truy vấn có phải là những gì bạn mong đợi hay không. Có nguy cơ là thử nghiệm kiểm tra sai sql, nhưng điều này sẽ được phát hiện trong các thử nghiệm tích hợp

2

Sự cố tôi gặp phải khi kiểm tra đơn vị bền bỉ, đặc biệt là không có ORM và do đó chế nhạo cơ sở dữ liệu của bạn (kết nối), là bạn không thực sự biết liệu các truy vấn của bạn có thành công hay không. Có thể là các truy vấn của bạn được thiết kế đặc biệt cho một phiên bản cơ sở dữ liệu cụ thể và chỉ thành công với phiên bản đó. Bạn sẽ không bao giờ tìm thấy điều đó nếu bạn giả lập cơ sở dữ liệu của mình. Vì vậy, theo ý kiến ​​của tôi, kiểm tra đơn vị kiên trì chỉ sử dụng hạn chế. Bạn nên luôn luôn thêm các thử nghiệm chạy trên cơ sở dữ liệu được nhắm mục tiêu.

+0

Tôi đồng ý, mặc dù tôi chưa bao giờ là người thuần chủng TDD, tôi chắc chắn thấy rất nhiều lợi ích của TDD nhưng bỏ qua thực tế và không thực sự kiểm tra hồ sơ của bạn vào và ra khỏi cơ sở dữ liệu của bạn. sẽ làm trong tự nhiên. Vì vậy, nhiều lần trước khi tôi nhận được một "lỗi" được gán cho tôi rằng mã của tôi không hoạt động và tôi sẽ chạy các bài kiểm tra đơn vị của mình và tìm ra một nhà phát triển khác dậm chân trên sproc của tôi (sprocs ác ác) và không bao giờ quan tâm để chạy các bài kiểm tra đơn vị của tôi để xem họ đã phá hủy toàn bộ hệ thống. –

2

Đối với NHibernate, tôi chắc chắn sẽ chủ trương chỉ nhạo ra API NHibernate để kiểm tra đơn vị - tin tưởng thư viện để làm điều đúng. Nếu bạn muốn đảm bảo rằng dữ liệu thực sự đi đến DB, hãy thử nghiệm tích hợp.

1

Kiểm tra đơn vị kỹ thuật về tính kiên trì không phải là các bài kiểm tra Đơn vị mà chúng là các bài kiểm tra Tích hợp.

Với C# sử dụng mbUnit, bạn chỉ cần sử dụng SqlRestoreInfo và Rollback thuộc tính

[TestFixture] 
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>] 
    public class Tests 
    { 

     [SetUp] 
     public void Setup() 
     { 

     } 

     [Test] 
     [RollBack] 
     public void TEST() 
     { 
      //test insert. 
     } 
    } 

Cùng có thể được thực hiện trong NUnit, excpet tên thuộc tính khác nhau slighty.

Để kiểm tra xem truy vấn của bạn có thành công hay không, bạn thường cần theo dõi truy vấn thứ hai để xem liệu cơ sở dữ liệu đã được thay đổi như bạn mong đợi chưa.

3

Tôi đã viết một bài đăng ở đây liên quan đến unit testing the data layer bao gồm vấn đề chính xác này. Xin lỗi cho các plug (đáng xấu hổ), nhưng bài viết là quá dài để gửi ở đây.

Tôi hy vọng rằng sẽ giúp bạn - nó đã làm việc rất tốt cho tôi trong 6 tháng qua trên 3 dự án đang hoạt động.

Kính trọng,

Rob G

15

Như Mike Stone said, DbUnit là rất tốt để khai thác cơ sở dữ liệu vào một nhà nước biết trước khi chạy thử nghiệm của bạn. Khi các bài kiểm tra của bạn kết thúc, DbUnit có thể đặt cơ sở dữ liệu trở lại trạng thái trước khi bạn chạy thử nghiệm.

DbUnit (Java)

DbUnit.NET

1

Tôi thường tạo ra một kho lưu trữ và sử dụng để tiết kiệm thực thể của tôi, sau đó lấy một tươi. Sau đó, tôi khẳng định rằng các lấy được bằng với lưu.

2

Đối với các dự án dựa trên JDBC, có thể sử dụng khung công tác Acolyte: http://acolyte.eu.org. Nó cho phép mockup truy cập dữ liệu mà bạn muốn thử nghiệm, hưởng lợi từ việc trừu tượng JDBC, mà không cần phải quản lý một DB thử nghiệm cụ thể.

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