2010-09-01 31 views
31

Chúng tôi cần một số mã thiết lập một lần toàn cầu trong bộ thử nghiệm của chúng tôi. Chúng tôi có thể làm điều đó nhiều hơn một lần nhưng phải mất một thời gian.NUnit khởi tạo toàn cầu - ý tưởng tồi?

  • Yêu cầu của tất cả các đồ đạc để [TestFixtureSetUp] không hoạt động. Nó phải chạy trước tất cả mã [TestFixtureSetUp].

  • Đặt mã vào trong Main() vì chúng tôi giữ các cụm thử nghiệm dưới dạng tệp thi hành. Tuy nhiên Main không được thực thi trong ứng dụng khách GUI.

  • Tạo một lớp riêng biệt với một hàm tạo tĩnh để khởi tạo chỉ hoạt động khi bạn tham chiếu lớp mà chúng tôi không ưa thích làm trong mỗi lớp.

  • Thừa kế tất cả các đồ đạc thử nghiệm từ một lớp cơ sở và thêm một hàm tạo tĩnh vào nó làm cho nhiều cuộc gọi đến mã init.

Bây giờ cho các trường hợp, tôi có hai câu hỏi:

1) là "thiết lập toàn cầu" là một ý tưởng rất xấu mà nó không được hỗ trợ bởi NUnit?

2) Cách đau đớn nhất, phổ biến nhất để đạt được điều này là gì?

+1

Bằng cách cho những ai tự hỏi, MBUnit hỗ trợ "AssemblyFixture" lớp mà cố cài đặt đang chạy một lần mỗi lắp ráp. Tôi biết câu hỏi của tôi là về NUnit nhưng bất cứ ai đang nghĩ về một công tắc cũng nên xem xét điều đó. –

Trả lời

78

[SetUpFixture]

Đây là thuộc tính mà đánh dấu một lớp có chứa một thời gian thiết lập hoặc teardown phương pháp cho tất cả các đồ đạc kiểm tra dưới một không gian tên nhất định.

Phương pháp SetUp trong SetUpFixture được thực hiện một lần trước bất kỳ đồ đạc nào có trong không gian tên của nó. Phương pháp TearDown được thực hiện một lần sau khi tất cả các đồ đạc đã hoàn thành thực hiện.

Khởi tạo rộng toàn hội. Nếu bạn không đặt lớp trong bất kỳ không gian tên nào, nó sẽ áp dụng cho tất cả các bài kiểm tra trong assembly.

ví dụ:

// using statements 

[SetUpFixture] 
public class GlobalSetup { 
    [SetUp] 
    public void ShowSomeTrace() { 
    Trace.WriteLine("It works..."); // won't actually trace 
    } 
} 

http://www.nunit.org/index.php?p=setupFixture&r=2.4

+0

Ồ tôi nghĩ 'SetUpFixture' và' TestFixtureSetUp' là giống nhau, một thứ không được dùng nữa. Đó là câu trả lời, cảm ơn! –

+10

Nó nói điều này trong các tài liệu, nhưng để chỉ ra một cách rõ ràng ..... Nếu bạn không đặt lớp này vào một không gian tên ở tất cả, nó sẽ được sử dụng cho "lắp ráp rộng" thiết lập/teardown. –

+0

@GregB Tôi đã thêm bình luận của bạn vào câu trả lời thực tế, cổ vũ. – ashes999

0

1) Tôi đoán nó phụ thuộc vào ngữ cảnh. Tôi chưa bao giờ cần thiết lập toàn cầu trên bất kỳ dự án nào, nhưng tôi có thể tưởng tượng các kịch bản, ví dụ: một ứng dụng chỉ đọc dữ liệu và thiết lập dữ liệu chung chung.

2) Bạn có thể thiết lập toàn cầu, ví dụ: trong cơ sở vật cố bạn đề cập, trạng thái. I E. có một tài sản HasRun hoặc tương tự được kiểm tra trước khi thực thi.

1

Tôi không nghĩ rằng có một cách tốt đẹp, được xây dựng để đạt được nó - có lẽ vì NUnit có nghĩa là để được sử dụng cho các bài kiểm tra đơn vị chủ yếu, và bạn không cần bất kỳ thiết lập toàn cầu cho các bài kiểm tra đơn vị (mọi thứ nên bị cục bộ chế giễu trong mọi vật cố định).

Tuy nhiên, khá phổ biến khi sử dụng NUnit cho các bài kiểm tra tích hợp và có rất phổ biến để thiết lập toàn cầu - như trong trường hợp của bạn. Có một vài tùy chọn hợp lý tại đây:

  1. Dự án hiện tại của chúng tôi thường làm trong tập lệnh msbuild đang chạy thử nghiệm. Những lợi ích mà bạn không cần phải nhớ về bất kỳ thiết lập đặc biệt nào khi bạn viết các bài kiểm tra mới. Nhược điểm - bạn phải chắc chắn rằng bạn có tất cả mọi thứ thiết lập khi bạn chạy các bài kiểm tra từ IDE.

  2. Nếu ở trên không phải là một tùy chọn bạn có thể sử dụng ý tưởng cuối cùng của mình - để kế thừa các bài kiểm tra từ một lớp cơ sở chung. Các lớp cơ sở sau đó có thể tham khảo một lớp singleton (bạn có thể tìm thấy bài viết Jon Skeets về cách thực hiện một singleton), mà sẽ làm các thiết lập. Bằng cách này, nó sẽ chỉ chạy một lần.

+0

Tôi muốn đặt "AssertUIEnabled" thành false trên trình nghe theo dõi mặc định để tôi không nhận được cửa sổ bật lên nếu xác nhận không thành công ở đâu đó trong ngăn mã. Đây là điều tôi muốn làm một lần và tôi muốn nó xảy ra cho tất cả các bài kiểm tra. – Marius

+1

Tôi đang thử nghiệm một ứng dụng MVC3 sử dụng ActiveRecord, mà tôi cần phải khởi tạo, một lần, trước khi chạy tất cả các thử nghiệm - làm thế nào để có một trường hợp sử dụng tốt? :) – ashes999

11

Như đã nêu trong nhận xét của tôi, bạn có thể đạt được bước lắp ráp rộng bằng cách sử dụng SetUpFixture nằm ở cấp độ lắp ráp.Tôi cần thiết này để tắt các giao diện người dùng trên dấu vết mặc định nghe:

[SetUpFixture] 
public class AssemblySetup 
{ 
    [SetUp] 
    public void Setup() 
    { 
     var traceListener = Debug.Listeners.Cast<TraceListener>().FirstOrDefault(listener => listener is DefaultTraceListener) as DefaultTraceListener; 

     if (traceListener != null) 
      traceListener.AssertUiEnabled = false; 
    } 
} 

Thông tin thêm về lắp ráp hoặc thiết lập không gian tên: http://www.nunit.org/index.php?p=setupFixture&r=2.4

Lưu ý: Như đã chỉ ra bởi những người khác, không sử dụng này để cô lập tham nhũng giữa thử nghiệm của bạn.

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