2009-05-28 25 views
13

Tôi đã thực hiện một số nghiên cứu về phát triển thử nghiệm và thấy nó khá thú vị.Thứ tự thực hiện trong NUnit là gì?

Một trong những điều tôi gặp phải là khi bạn viết các bài kiểm tra, có một thứ tự thực hiện thiết lập và phương pháp thử ([Thiết lập] và [Kiểm tra]).

Có những người khác mà bạn có thể sử dụng trong khi kiểm tra và nếu có thì thứ tự thực hiện của những thứ đó, chẳng hạn như vứt bỏ hoặc gì đó? Tôi thấy thiết lập thi đấu thử nghiệm, nhưng không quá quen thuộc với điều đó.

Ví dụ:

Khi tôi chạy thử nghiệm, nó [Setup] đầu tiên và sau đó chạy [Test] khi nó đi vào thử nghiệm tiếp theo nó chạy [Setup] một lần nữa và sau đó đi vào [ Kiểm tra].

Tôi đang sử dụng NUnit nếu điều đó có ích.

Dưới đây là một ví dụ cắt ngắn về những gì tôi đã thiết lập:

using NUnit.Framework; 

    namespace TestingProject 
    { 
     [TestFixture] 
     public class CustomerService_Tests 
     { 
      public string MyAccount = string.Empty; 

      [SetUp] 
      public void Setup() 
      { 
       MyAccount = "This Account"; 
      } 

      [Test] 
      public void Validate_That_Account_Is_Not_Empty() 
      { 
       Assert.That(!string.IsNullOrEmpty(MyAccount)); 
      } 

      [Test] 
      public void Validate_That_Account_Is_Empty() 
      { 
       Assert.That(string.IsNullOrEmpty(MyAccount)); 
      } 
     } 
    } 

Vì vậy, khi tôi chạy thử nghiệm, nó làm việc thiết lập, và sau đó là thử nghiệm đầu tiên, sau đó thiết lập và sau đó thử nghiệm thứ 2.

Câu hỏi của tôi là những loại khác mà tôi có thể sử dụng trong khi thử nghiệm như [Thiết lập] và [Kiểm tra] và thứ tự thực hiện cho những điều này là gì.

Trả lời

20

Sử dụng NUnit (không chắc chắn về những người khác), bạn có theo trình tự sau các vụ hành quyết:

TestFixtureSetup

Cài đặt

thử nghiệm

TearDown

Cài đặt

thử nghiệm

TearDown

TestFixtureTearDown

Mỗi khi bạn chạy thử nghiệm của bạn nó sẽ luôn luôn thực hiện theo thứ tự đó.

Nếu bạn xem mã sau, bạn có thể thấy bản sao chính xác của những gì tôi đang nói đến. Bạn thậm chí có thể sao chép và dán mã này và nó sẽ làm việc (sử dụng NUnit, không chắc chắn nếu nó sẽ làm việc với những người khác).

Nếu bạn chạy điều này trong chế độ gỡ lỗi và đặt điểm ngắt trên mỗi phương pháp, bạn có thể thấy thứ tự thực hiện trong khi gỡ lỗi.

using NUnit.Framework; 

namespace Tester 
{ 
    [TestFixture] 
    public class Tester 
    { 
     public string RandomVariable = string.Empty; 

     [TestFixtureSetUp] 
     public void TestFixtureSetup() 
     { 
      //This gets executed first before anything else 
      RandomVariable = "This was set in TestFixtureSetup"; 
     } 

     [SetUp] 
     public void Setup() 
     { 
      //This gets called before every test 
      RandomVariable = "This was set in Setup"; 
     } 

     [Test] 
     public void MyTest1() 
     { 
      //This is your test... 
      RandomVariable = "This was set in Test 1"; 
     } 

     [Test] 
     public void MyTest2() 
     { 
      //This is your test... 
      RandomVariable = "This was set in Test 2"; 
     } 

     [TearDown] 
     public void TestTearDown() 
     { 
      //This gets executed after your test gets executed. 
      //Used to dispose of objects and such if needed 
      RandomVariable = "This was set in TearDown"; 
     } 

     [TestFixtureTearDown] 
     public void TestFixtureTearDown() 
     { 
      //Executes Last after all tests have run. 
      RandomVariable = "This was set in TestFixtureTearDown"; 

     } 

    } 
} 
+6

Cũng có thể làm Console.WriteLine và không phải đặt điểm ngắt, nhưng +1 anyway – Davy8

+5

Điểm tốt! Ngoài ra, bạn có thể làm một Debug.WriteLine() nếu bạn muốn làm theo nó trong cửa sổ gỡ lỗi. – CodeLikeBeaker

+0

Tôi đã thử điều này và nó hoạt động rất tốt! @ Davy8, tôi đã làm Console.WriteLine() và tôi thấy những thay đổi xảy ra và có thể thấy thứ tự thực hiện. Đây là thứ tuyệt vời. Cảm ơn rất nhiều vì sự giúp đỡ của bạn! –

4

Đối với mỗi lớp học mà bạn có bài kiểm tra, thi đấu thử nghiệm, bạn có thể chỉ định 4 phương pháp đặc biệt.Tên của các phương thức này không thực sự quan trọng, nhưng bạn cần phải gắn thẻ các phương thức với một trong bốn thuộc tính sau để xác định chúng.

Công ước ra lệnh rằng bạn gọi các phương thức giống như các thuộc tính, nhưng như tôi đã nói, các thuộc tính là bit quan trọng.

Lưu ý rằng các thuộc tính tôi mô tả ở đây là các thuộc tính được tìm thấy trong NUnit, nhưng các thuộc tính tương tự (nếu không giống nhau) được sử dụng trong hầu hết các khung kiểm tra đơn vị.

Các thuộc tính là:

  • TestFixtureSetUp
  • TestFixtureTearDown
  • Setup
  • TearDown

Hai đầu tiên đã làm với các lớp học như một toàn thể. Phương pháp được gắn thẻ với thuộc tính TestFixtureSetUp được chạy một lần, trước bài kiểm tra đầu tiên trong lớp.

Sau khi tất cả các thử nghiệm trong lớp đã được thực hiện, phương pháp được gắn thẻ với thuộc tính TestFixtureTearDown được thực thi, một lần.

Bạn có thể sử dụng hai công cụ này để chuẩn bị các cấu trúc dữ liệu chung giống nhau cho tất cả các thử nghiệm và không bị sửa đổi bởi bất kỳ thử nghiệm nào (điều này là quan trọng).

Hai số cuối cùng, SetUpTearDown, được sử dụng để gắn thẻ hai phương pháp sẽ được chạy trước và sau mỗi thử nghiệm riêng lẻ.

Phương pháp được gắn thẻ với SetUp được gọi trước mỗi lần kiểm tra và phương pháp được gắn thẻ với TearDown được gọi sau mỗi lần kiểm tra. Bạn có thể sử dụng chúng để chuẩn bị các cấu trúc dữ liệu chung, mặc dù chúng giống nhau cho mỗi bài kiểm tra, chúng sẽ được thay đổi bởi một số hoặc tất cả các bài kiểm tra, vì vậy tốt nhất bạn nên chuẩn bị một bản sao mới cho mỗi bài kiểm tra.

Đặt ra việc thực hiện các phương pháp này là pseudo-code cho chúng ta theo thứ tự:

execute TestFixtureSetUp, if present 
for each test do 
    execute SetUp, if present 
    execute actual test 
    execute TearDown, if present 
execute TestFixtureTearDown, if present 

Việc sử dụng những thuộc tính này là hoàn toàn không bắt buộc. Bạn không cần phải có số SetUp để có số TearDown hoặc ngược lại. Chúng chỉ là những điểm bạn có thể muốn thực thi mã tại.

0

Trong NUnit 2.5.1 thứ tự thực hiện đã thay đổi một lần nữa. Tôi đồng ý rằng unittest không được can thiệp lẫn nhau.

0

NUnit 3.0 đã thực hiện một số thay đổi liên quan đến kiểm tra đơn vị thuộc tính như đã nêu here:

TestFixtureSetUpAttribute và TestFixtureTearDownAttribute tiếp tục được hỗ trợ là từ đồng nghĩa cho OneTimeSetUpAttribute và OneTimeTearDownAttribute trong đồ đạc kiểm tra, nhưng một đang bị phản đối.

Kể từ SetUpAttribute và TearDownAttribute được sử dụng trong hai cách khác nhau, nó không thể chỉ đơn giản là không dùng cách sử dụng của họ trong SetUpFixture. Chúng đã không được phép trong ngữ cảnh đó, là một thay đổi phá vỡ .

Vì vậy, trình tự thực hiện như sau:

  • OneTimeSetUp
  • Cài đặt
  • thử nghiệm
  • TearDown
  • Cài đặt
  • thử nghiệm
  • TearDown
  • OneTimeTearDown
Các vấn đề liên quan