2011-06-21 44 views
25

Tôi có một số bộ thử nghiệm tích hợp được triển khai trong C#/NUNit. Mỗi bộ thử nghiệm là một lớp riêng biệt, mỗi thiết lập fixture tạo ra và điền một cơ sở dữ liệu SQL Server từ các kịch bản lệnh. Điều này tất cả được sử dụng để làm việc tốt trước khi Resharper 5.1.Làm thế nào để chạy thử nghiệm NUnit đồ đạc serially?

Thật không may, Resharper 5.1 bắt đầu chạy nhiều đồ đạc cùng một lúc. Đây là một sự thay đổi đột phá - tất cả họ đều cố gắng tạo ra và cư trú cùng một cơ sở dữ liệu, mà rõ ràng kết thúc trong một mớ hỗn độn. Có cách nào tôi có thể Resharper chạy đồ đạc thử nghiệm của tôi serially?

Nếu không, bạn sẽ đề xuất gì để chạy các thiết bị thử nghiệm NUnit của mình một cách thẳng thắn, một vật cố tại một thời điểm? Thứ tự mà các thử nghiệm riêng lẻ chạy không quan trọng.

+2

Bạn có nghĩa là nối tiếp? Theo thứ tự ngụ ý rằng thứ tự mà các thử nghiệm đang chạy vấn đề. Về cơ bản, chỉ có nghĩa là chúng chạy một lần, nhưng thứ tự không quan trọng. – Davy8

+0

@ Davy8: Có, serially, tôi đã sửa chữa câu hỏi, cảm ơn! –

Trả lời

22

Tôi không biết liệu nó có thể ngăn chặn ReSharper từ chạy thử nghiệm song song ; nếu không, các hack sau đây có thể làm việc: Tạo một lớp tĩnh với một thành viên chỉ đọc tĩnh Monitor. Sau đó, trong [TestFixtureSetUp], hãy gọi Enter() trên màn hình và gọi Exit() trên màn hình theo số [TestFixtureTearDown]. Bằng cách đó, chỉ một lần thi đấu sẽ được phép chạy cùng một lúc. Không đẹp, mặc dù ...

+2

Tôi đã làm điều này và nó hoạt động. –

0

Trừ khi mã đang được thử nghiệm thực hiện quản lý giao dịch của riêng mình, bạn có thể chạy từng thử nghiệm bên trong một giao dịch. Bằng cách đó, các bài kiểm tra khác nhau sẽ không làm phiền lẫn nhau. Ngoài ra, bạn không phải lo lắng về việc làm sạch sau mỗi lần kiểm tra, vì giao dịch của mỗi thử nghiệm có thể chỉ đơn giản là hủy bỏ sau khi thử nghiệm được hoàn thành.

Trong các dự án của chúng tôi, chúng ta thường để thử nghiệm hội nhập của chúng tôi xuất phát từ một lớp trông nhiều hơn hoặc ít hơn như thế này:

public class TransactionalTestFixture 
{ 
    private TransactionScope TxScope; 

    [SetUp] 
    public void TransactionalTestFixtureSetUp() 
    { 
     TxScope = new TransactionScope(TransactionScopeOption.RequiresNew, 
             new TransactionOptions {IsolationLevel = IsolationLevel.Serializable}); 
    } 

    [TearDown] 
    public void TransactionalTestFixtureTearDown() 
    { 
     TxScope.Dispose(); 
    } 
} 
+0

Điều này sẽ không hoạt động - đây là các thiết bị thử nghiệm chứ không phải thử nghiệm riêng lẻ. Mỗi tạo một cơ sở dữ liệu mới từ đầu. –

+0

@AlexKuznetsov: Ah; Tôi thấy bây giờ mà tôi đã không đọc đoạn đầu tiên cũng đủ. –

+1

Nếu bạn sử dụng '[TestFixtureSetUp]' và '[TestFixtureTeardown]' thay thế thì sao? –

0

Đặt tên cho chúng theo thứ tự chữ cái, ví dụ: đặt tiền tố cho chúng bằng một chữ cái biểu thị thứ tự chạy của chúng. Nếu bạn cần điều này xảy ra, bạn sẽ có thể chấp nhận quy ước đặt tên khó chịu này.

+0

Tất nhiên bạn có thể xem xét việc tái cấu trúc các bài kiểm tra để có thể chạy với cá thể sqlite riêng của họ cho mỗi trận đấu, điều này có thể mất thời gian nhưng trung thực hơn một chút. –

+0

Resharper có đảm bảo rằng nó sẽ luôn chạy thử nghiệm theo thứ tự bảng chữ cái? 4.1 đã không làm điều đó - nó chạy chúng theo thứ tự từ trên xuống dưới. 5.1 sắp xếp chúng theo thứ tự bảng chữ cái. –

+0

@ Alex: Tôi đã thử nó vào ngày hôm qua và nó chạy thử nghiệm của tôi đồ đạc cái khác theo thứ tự chữ cái. Chúng tôi sẽ luôn luôn không muốn dựa vào điều này để có được các bài kiểm tra để làm việc mặc dù như bất kỳ thử nghiệm nên đứng một mình hoặc nó không thực sự là một đơn vị. Tôi không thể tìm thấy bất kỳ cài đặt nào để thực hiện các kiểm tra song song, nhưng tôi không có các phiên bản trước đó. –

1

Bạn có chắc chắn về điều này không? Tôi chỉ cố gắng này ra .. bằng cách đặt một dấu vết của các hình thức sau đây trong các bài kiểm tra trong 3 diff NUnit đồ đạc tiếp theo là một "Chạy tất cả". Dường như không chạy song song.

Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss.ffff") + "VC:Start"); 
Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss.ffff") + "VC:Done"); 

Output tôi thấy là: (R # Xây dựng 5.1.1753.1)

01:06:41.6639IOC 
01:06:41.6649Done - IOC 

01:06:41.6679VC:Start 
01:06:41.6729VC:Done 

01:06:41.2439Mef 
01:06:41.6589Mef-Done 
Các vấn đề liên quan