[翻譯]NUnit---SetUp and SetUpFixture and Suite Attributes(十九)

SetUpAttribute (NUnit 2.0 / 2.5)函數

  本特性用於TestFixture提供一個公共的功能集合,在呼叫每一個測試方法以前執行。同時也用在SetUpFixture中,SetUpFixture在相同命名空間或者程序集也實現相同的做用。性能

  在NUnit2.5以前,類必須只能有一個SetUp方法且必須是一個實例方法。測試

  從NUnit2.5開始,SetUp方法可使一個靜態或者實例方法,並且在一個Fixture能夠屢次使用。一般多個Setup方法定義在不一樣層級的繼承。ui

  若是一個Setup方法失敗或者拋出一個異常,測試不會執行,同時產生一個失敗或者錯誤。spa

Example:命令行

namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;

  [TestFixture]
  public class SuccessTests
  {
    [SetUp] public void Init()
    { /* ... */ }

    [TearDown] public void Cleanup()
    { /* ... */ }

    [Test] public void Add()
    { /* ... */ }
  }
}

Inheritance(繼承)翻譯

  能夠從任何基類繼承到SetUp特性功能。可是,若是一個基類已經定義過一個Setup方法,這個方法在繼承類的每一個測試方法前都會被執行。code

  在NUnit2.5以前,只容許用於一個Setup方法。若是你想在基類中有Setup功能在繼承類中添加更多的Setup功能,須要手動的調用基類Setup方法。對象

  在NUnit2.5中,你能夠在基類和繼承類中定義Setup方法達到相同的目的。NUnit會在調用繼承類Setup方法以前調用基類的Setup方法。blog

Note:儘管能夠再一個類中能夠屢次定義Setup方法,但仍是儘可能這樣使用。由於同一個類的的Setup方法執行順序是不肯定的。

 

SetUpFixtureAttribute (NUnit 2.4)

  本特性標記一個類包含setup或teardown方法,爲相同命名空間下的全部測試夾具提供相關功能。這個類最多包含一個SetUpAttribute標記的方法和TearDownAttribute標記的方法。

  使用SetUpFixture修飾的類有以下限制條件:

    必須有一個public輸出,不然NUnit不能發現。

    必須有一個默認構造函數,不然Unit不能進行構造。

   在SetUpFixture中的SetUp方法在同一命名空間中的任何fixtures執行時都會執行一次。TearDown方法在全部fixtures執行完畢以後執行一次。在下面示例中,RunBeforeAnyTests()在NUnit.Tests命名空間中的全部測試用例或者setup方法以前執行;RunAfterAnyTests()在NUnit.Tests命名空間全部測試用例執行完畢和繼承類中的teardown方法執行完畢以後執行。

  在一個命名空間中只能建立一個SetUpFixture類。在任何命名空間以外的SetUpFixture爲整個程序集提供SetUp 和TearDown 方法。

Example:

namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;

  [SetUpFixture]
  public class MySetUpClass
  {
    [SetUp]
    RunBeforeAnyTests()
    {
      // ...
    }

    [TearDown]
    RunAfterAnyTests()
    {
      // ...
    }
  }
}

 

SuiteAttribute (NUnit 2.0/2.4.4)

  本特性用於定義測試子集在命令行模式下使用/fixture選項時執行。在NUnit2.0中引入用於取代老式從TestSuite類繼承的方式。

  最初由於基於命名空間的動態建立,NUnit開發者相信Suite機制的需求會減小(Suite提供向後兼容)。但事實證實這是錯誤的。套件在如今還有許多人使用,全部咱們努力恢復他們的可用性。套件機制依賴一個SuiteAttribute標記的靜態屬性。經典模式從2.0開始支持,屬性返回一個即將執行的TestSuite類型。

  老式方法:

namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;
  using NUnit.Core;

  public class AllTests
  {
    [Suite]
    public static TestSuite Suite
    {
      get
      {
        TestSuite suite = new TestSuite("All Tests");
        suite.Add(new OneTestCase());
        suite.Add(new Assemblies.AssemblyTests());
        suite.Add(new AssertionTest());
        return suite;
      }
    }
  }
}

  這個方法有一個嚴重問題:它須要引用用例測試一般不會引用的nunit.core程序集。這意味着測試用例若是不從新編譯就不可以在不一樣版本NUnit中進行移植。在某些特殊狀況下,引入多個版本的core程序集到致使NUnit不能正常運行。

  從NUnit2.4.4開始,提供一個新的能夠方法。用SuiteAttribute標記的屬性能夠返回一個包含測試夾具對象或者類型的集合。若是是Type,NUnit會用這個Type建立一個對象。若是是對象,則被認爲是預先建立的對象。這容許參數化構造函數或者可賦值屬性可以做爲夾具。

  經過SuiteAttribute建立的測試套件能夠包含TestFixtureSetUp 和TestFixtureTearDown方法,執行一次性的setup and teardown方法。

New Approach - Fixture Objects

namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;

  private class AllTests
  {
    [Suite]
    public static IEnumerable Suite
    {
      get
      {
        ArrayList suite = new ArrayList();
        suite.Add(new OneTestCase());
        suite.Add(new AssemblyTests());
        suite.Add(new NoNamespaceTestFixture());
        return suite;
      }
    }
  }
}

 

New Approach - Fixture Types

 

namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;

  private class AllTests
  {
    [Suite]
    public static IEnumerable Suite
    {
      get
      {
        ArrayList suite = new ArrayList();
        suite.Add(typeof(OneTestCase));
        suite.Add(typeof(AssemblyTests));
        suite.Add(typeof(NoNamespaceTestFixture));
        return suite;
      }
    }
  }
}

 

 

限制

  NUnit支持自定義套件有以下兩個限制:

    1.在使用新方法時,不能在測試套件中包含測試用例。若是想要這麼達到這個目的,必須使用舊方法並建立一個從NUnit.Core.TestCase繼承的對象。另:由於須要引用core程序集故不推薦這樣使用。

    2.測試套件不會在GUI中顯示,也在任何執行方式(GUI、控制檯)中不會自動自行。套件機制的歷史目的是在頂層執行提供一個聚合測試。所以,只在控制檯或者GUI命令行模式下/fixture選項執行。

  目前正在評估在未來的NUnit版本中移除這些限制的方法。

 

小記:距離上次翻譯差很少半年了,期間也想翻譯幾篇,不是沒有時間,並且人的惰性使然。看書的那段時間每天都看,一旦懶惰不看書,想要再拿起來就有一個聲音唸叨明天再看或者某個時間後再看。提醒本身:堅持不懈很重要,不論是爲了實際的money仍是爲了發展,書不可不看。

相關文章
相關標籤/搜索