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

SetUpAttribute (NUnit 2.0 / 2.5)

  本特性用于TestFixture提供一个公共的功能集合,在呼叫每个测试方法之前执行。同时也用在SetUpFixture中,SetUpFixture在相同命名空间或者程序集也实现相同的作用。

  在NUnit2.5之前,类必须只能有一个SetUp方法且必须是一个实例方法。

  从NUnit2.5开始,SetUp方法可以使一个静态或者实例方法,而且在一个Fixture可以多次使用。通常多个Setup方法定义在不同层级的继承。

  如果一个Setup方法失败或者抛出一个异常,测试不会执行,同时产生一个失败或者错误。

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方法,这个方法在继承类的每个测试方法前都会被执行。

  在NUnit2.5之前,只允许用于一个Setup方法。如果你想在基类中有Setup功能在继承类中添加更多的Setup功能,需要手动的调用基类Setup方法。

  在NUnit2.5中,你可以在基类和继承类中定义Setup方法达到相同的目的。NUnit会在调用继承类Setup方法之前调用基类的Setup方法。

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还是为了发展,书不可不看。

原文地址:https://www.cnblogs.com/kim01/p/3772168.html