zoukankan      html  css  js  c++  java
  • [翻译]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还是为了发展,书不可不看。

  • 相关阅读:
    animate()的使用
    jQuery UI中datepicker()的使用
    newsletter 在不同邮箱中发送的问题
    用户评价 打星等级 效果 jQuery
    SpringBoot整合WebSocket
    SpringBoot之自定义拦截器
    SpringBoot整合MyBatis
    EF实体框架简单原理及基本增删改查用法(上)
    数据库内容导出到Excel
    Asp.Net页面生命周期
  • 原文地址:https://www.cnblogs.com/kim01/p/3772168.html
Copyright © 2011-2022 走看看