[翻译]NUnit---SetUp and SetUpFixture and Suite Attributes(十九)
2014-06-06 11:56 Max蚊子 阅读(2107) 评论(0) 编辑 收藏 举报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还是为了发展,书不可不看。
作者:Max蚊子
网站:feiger.cn 飞鸽博客,关注互联网、站长圈的程序员博客!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。