Test-Driven Development In .NET 部分译文
TestFixture Attribute
TestFixture Attribute说明一个类包含了测试方法。当你为工程中的类加上这个属性时,Test Runner将搜索这个类中的测试方法。
下列这段代码描述了这个属性的用法(本文中的所有代码都是用C#写成,但NUnit也支持其它的.Net语言,比如VB.Net。请参见NUnit的相关文档)
namespace UnitTestingExamples { using System; using NUnit.Framework; [TestFixture] public class SomeTests { } } |
TestFixture Attribute 的使用有一个额外的要求。那就是需要一个公共的默认构造器,或没有任何构造器(这其实是同一个意思)。
Test Attribute
Test Attribute 用来表示在TestFixture Attribute中的方法,这个方法会被Test Runner应用程序执行。这个方法必须是公共的,返回void,而且没有任何参数。否则,它不会在Test Runner Gui中显示出来,当然在测试该类的时候,该方法也不会得到执行。
下列代码显示了这个属性的用法
namespace UnitTestingExamples { using System; using NUnit.Framework; [TestFixture] public class SomeTests { [Test] public void TestOne() { // Do something... } } } |
SetUp 和 Teardown Attributes
当你开始Unit Tests的时候,某些情况下,你不得不考虑在某个测试之前(之后)处理一些事情。你可以通过创建私有函数并在测试方法在调用它,或者你可以使用Setup或Teardown属性。这些属性表示了这个方法将在Test Fixture中每一个测试方法之前(SetUp)或之后(Teardown)执行。当你需要创建一些很多方法都用到的对象(如数据库连接)时,这些属性就可以起作用了。
下面的例子展示了这些个属性的用法
namespace UnitTestingExamples { using System; using NUnit.Framework; [TestFixture] public class SomeTests { private int _someValue; [SetUp] public void Setup() { _someValue = 5; } [TearDown] public void TearDown() { _someValue = 0; } [Test] public void TestOne() { // Do something... } } } |
ExpectedException Attribute
有些时候,你需要构造一个环境来确保发生一个异常。当然,你可以构建一个大的try…catch语句并设置一个bool变量来达到目的,但这有点hack-ish。这种情况下,你应该使用ExpectedException Attribute,下面显示了一个例子
namespace UnitTestingExamples { using System; using NUnit.Framework; [TestFixture] public class SomeTests { [Test] [ExpectedException(typeof(InvalidOperationException))] public void TestOne() { // Do something that throws an InvalidOperationException } } } |
上面的代码运行时如果生产一个InvalidOperationException异常,这个测试用例将验证通过。如果你期望发生多个类型的异常,你也可以使用多个这个属性。但你应该尽量不要这么做,因为,一个测试应当只做一件事。另外请注意,这个属性并不认可继承关系。换句话说,如果上而的代码抛出一个InvalidOperationException的子类,这个测试将失败。当使用这个属性时,你必须精确描述异常的类型。
Ignore Attribute
你不太会使用到这个属性,但当你需要这个属性时,你会很高兴它的存在。当你需要说明一个测试不必运行时,按如下的方式使用Ignore Attribute:
namespace UnitTestingExamples { using System; using NUnit.Framework; [TestFixture] public class SomeTests { [Test] [Ignore("We're skipping this one for now.")] public void TestOne() { // Do something... } } } |
如果你需要临时注释掉一个测试,请使用这个属性。它让你保留这个测试,并在测试运行窗口中提醒你。
Assertion Class
除了这些用来标识测试的属性之外,NUnit提供了一个你必须知道的重要的类,Assertion class。它提供了一系列的静态方法,你可以在你的测试代码中使用它们来验证产生的结果是否与你预期的结果一样。下面的这个例子表达了我的想法:
namespace UnitTestingExamples { using System; using NUnit.Framework; [TestFixture] public class SomeTests { [Test] public void TestOne() { int i = 4; Assertion.AssertEquals( 4, i ); } } } |