17

Tôi đang viết bài kiểm tra tích hợp cho một ứng dụng và không thể tìm thấy bất kỳ phương pháp hay nhất nào về cách thiết lập cơ sở dữ liệu thử nghiệm cho bộ tích hợp của tôi. Tôi đang làm việc trên một ứng dụng ASP.NET MVC4 bằng cách sử dụng Entity Framework code-đầu tiên.Tôi nên thiết lập các thử nghiệm tích hợp của mình như thế nào để sử dụng cơ sở dữ liệu thử nghiệm với Entity Framework?

Tôi có thể xác nhận rằng các thử nghiệm trong dự án thử nghiệm của tôi nói chuyện với cơ sở dữ liệu phát triển cục bộ trên máy của tôi theo mặc định. Đây không phải là lý tưởng, vì tôi muốn có một cơ sở dữ liệu mới mỗi khi tôi chạy thử nghiệm.

Làm cách nào tôi có thể thiết lập dự án thử nghiệm của mình để các thử nghiệm của tôi nói chuyện với một cá thể riêng biệt? Tôi giả định rằng có thể thiết lập một phiên bản SQL Server Compact Edition, nhưng tôi không chắc chắn làm thế nào để cấu hình này.

+0

Bài viết này bởi Jimmy Bogard là một đọc rất tốt về đề tài này: [Cô lập dữ liệu cơ sở dữ liệu trong các thử nghiệm hội nhập] (http://lostechies.com/jimmybogard/2012/10/18/isolating-database-data-in- tích hợp kiểm tra /). –

Trả lời

21

Cảm ơn bạn rất nhiều về @Justin và @Petro vì câu trả lời của bạn, điều này đã giúp tôi rất nhiều. Giải pháp mà tôi đưa ra là sự kết hợp các kỹ thuật bạn đã đề xuất. Giải pháp được mô tả bên dưới cung cấp cơ sở dữ liệu mới cho mỗi lần chạy thử nghiệm và một giao dịch riêng cho từng thử nghiệm.

Tôi đã thêm một chuỗi kết nối cơ sở dữ liệu cho thử nghiệm của tôi trong App.config của dự án thử nghiệm của tôi:

<connectionStrings> 
    <add name ="TestDatabase" 
    providerName="System.Data.SqlClient" 
    connectionString="Data Source=(LocalDb)\v11.0;Database=TestDatabase;Integrated Security=True"/> 
    </connectionStrings> 

Tôi tạo ra một lớp cơ sở cho kiểm tra tích hợp của tôi, để cung cấp thiết lập và teardown. Thiết lập khởi tạo ngữ cảnh, tạo DB nếu nó chưa tồn tại và bắt đầu một giao dịch. Teardown cuộn lại giao dịch.

public class EntityFrameworkIntegrationTest 
{ 
    protected MyDbContext DbContext; 

    protected TransactionScope TransactionScope; 

    [TestInitialize] 
    public void TestSetup() 
    { 
     DbContext = new MyDbContext(TestInit.TestDatabaseName); 
     DbContext.Database.CreateIfNotExists(); 
     TransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew); 
    } 

    [TestCleanup] 
    public void TestCleanup() 
    { 
     TransactionScope.Dispose(); 
    } 
} 

Cuối cùng, tôi có một lớp học mà sẽ chăm sóc của xóa cơ sở dữ liệu sau khi tất cả các cuộc thử nghiệm đã chạy:

[TestClass] 
public static class TestInit 
{ 
    // Maps to connection string in App.config 
    public const string TestDatabaseName = "TestDatabase"; 

    [AssemblyCleanup] 
    public static void AssemblyCleanup() 
    { 
     Database.Delete(TestDatabaseName); 
    } 
} 

tôi nên thêm rằng tôi thấy this blog post about Entity Framework hữu ích cho một sự hiểu biết sâu sắc hơn về những gì Entity Framework đang làm theo mui xe/theo quy ước.

+1

Tôi sẽ đặt DbContext.Database.CreateIfNotExists(); trong một phương thức được gán cho [AssemblyInitialize] – Elisabeth

+0

Nếu tôi chuyển tên cho hàm tạo của DbContext của tôi thì sẽ không có gì xảy ra. Nó vẫn sử dụng cấu hình mặc định cho cơ sở dữ liệu. Tại sao điều này làm việc cho bạn chứ không phải tôi? Kỳ dị. –

+0

Lớp MyDbContext ở đâu? Nó trông như thế nào? – Sonofblip

4

Chỉ cần thiết lập chuỗi kết nối trong app.config của dự án thử nghiệm đơn vị trỏ đến phiên bản DB mới.

Sau đó, bạn có thể sử dụng phương pháp khởi tạo và dọn dẹp trong lớp thử nghiệm để tạo và xóa DB.

Chuỗi kết nối chỉ là bình thường, ví dụ:

<add name="UnitTestDBConnection" connectionString="Data Source=(local);Initial Catalog=UnitTestDB;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/> 

Sau đó, để tạo DB, một lần mỗi bài kiểm tra, bạn có thể làm:

YourContext _ctx; 

    [TestInitialize] 
    public void Initiaslise() 
    { 

     YourNameDbInitialise initialiser = new YourNameDbInitialiseForTest(); 
     Database.SetInitializer(initialiser); 

     _ctx = new YourNameContext(); 

     initialiser.InitializeDatabase(_ctx);   
    } 

và này để xóa vào cuối mỗi bài kiểm tra

[TestCleanup] 
    public void Cleanup() 
    { 
     Database.Delete("YourName"); 
    } 
+0

Cảm ơn. Bạn có thể vui lòng chia sẻ một số mã trong câu trả lời của bạn cho thấy cách này được thực hiện? Làm cách nào để bạn tạo DB mới và làm cách nào để đảm bảo rằng bạn cung cấp chuỗi kết nối chính xác? – rouan

+1

Xem chỉnh sửa ở trên –

3

Nếu bạn đang sử dụng NUnit , bạn có thể sử dụng thuộc tính Setup/Teardown với TransactionScope để không cam kết thay đổi của mình đối với cơ sở dữ liệu:

[SetUp] 
public void SetUp() 
{ 
    transaction = new TransactionScope(); 
} 

[TearDown] 
public void TearDown() 
{ 
    if(transaction != null) 
     transaction.Dispose(); 
} 

Nếu bạn đang sử dụng một số khung kiểm tra đơn vị khác, nó phải có thuộc tính giống nhau. Tôi sẽ khuyên bạn nên tạo một lớp cơ sở DbItegrationTest cho tất cả các thiết bị thử nghiệm tích hợp của bạn vì vậy nếu bạn lấy được từ lớp này, tất cả các phương pháp thử nghiệm sẽ không thực hiện cam kết với cơ sở dữ liệu.

Để định cấu hình khung thực thể cho cơ sở dữ liệu khác, vui lòng ghi đè chuỗi kết nối db trong hội đồng kiểm tra của bạn.

+1

Tôi muốn sử dụng cơ sở dữ liệu hoàn toàn khác cho các thử nghiệm của mình. Sử dụng cùng một cơ sở dữ liệu có nghĩa là nó có khả năng chứa dữ liệu hạt giống và có thể thay đổi nếu ứng dụng được sử dụng vì một số lý do trong khi các thử nghiệm đang chạy. Việc sử dụng một cơ sở dữ liệu riêng biệt cũng sẽ có lợi ích bổ sung khi kiểm tra xem việc di chuyển của tôi có hoạt động đúng hay không. – rouan

+3

Bạn có thể sử dụng cơ sở dữ liệu khác cho các bài kiểm tra của mình. Đối với điều này chỉ cần cập nhật chuỗi kết nối trong app.config của hội đồng kiểm tra của bạn. Sử dụng cùng một tên chuỗi kết nối như trong ứng dụng MVC của bạn nhưng cập nhật tên cơ sở dữ liệu/thông tin đăng nhập, vv Nếu lắp ráp thử nghiệm của bạn không có app.config, bạn có thể thêm nó theo cách thủ công. –

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