1 准备TestDriven和NUnit
单元测试对于程序员来说基本是一个必备的技能。“千里之堤,溃于蚁穴”这句话对于程序员也适用。记得一位大牛说过“笨蛋都能写出让机器看懂的程序,真正的聪明人写出让人看得懂的程序”。单元测试能显著提高自己程序的质量,当项目变得很大的时候,良好的单元测试也能提高项目的质量,当然,它也能让人充满成就感。好吧,让我们开始单元测试之旅。
下载TestDriven:http://www.testdriven.net/default.aspx
下载NUnit:http://www.nunit.org/index.php?p=download
NUnit名气非常大,而且功能也很强,尽管NUnit支持GUI和Console两种工作方式,但是它使用起来确实不够直观,我们不得不不停地切换窗口以看到测试结果。而TestDriven就非常方便,它和Visual Studio .Net2003和2005都集成的非常好,做到了即指即测。能较大的提高我们测试的效率。在安装好TestDriven后,就可以看到下面的一个小小的图标。
我们可以针对整个测试文件和单个函数进行测试,非常方便。下面主要谈谈TestDriven支持的属性和参数。
2 TestDriven支持的一些重要的属性
TestDriven其实可以支持大部分NUnit支持的属性,但是有些属性是无法支持的。其实对于自己进行单元测试来说,只需要知道常用的10多个属性就可以进行很好的测试了。下面就最常用和最重要的属性做一些解释。
在开始测试之前,记得引用nunit.framework这个dll,然后
2.1 [TestFixture] 属性
这个属性通常是用来修饰测试类,表明这个类是用于测试的。一般把它放在类声明的上面,就像下面这样
2.2 [TestFixtureSetUp] 属性
这个属性通常用来修饰一个方法,表明这个方法先于所有测试方法之前运行,类似于构造函数。那么我们可以用来初始化一些对象等,非常有用。
2.3 [TestFixtureTearDown] 属性
这个属性也是用于修饰方法,它会在所有测试方法运行完毕以后运行。你可以用它来释放一些资源。
2.4 [SetUp]属性
这个属性用来修饰方法,表明它会在每一个测试方法运行之前运行。那么可以用它来重设一些变量,是每个方法在运行之前都有良好的初值。
2.5 [TearDown]属性
这个属性通常用来修饰方法,表明这个方法会在每个测试方法运行完之后运行一次。 可以用来清理一些变量或者环境。
2.6 [Test]属性
这个属性是最有用处的,因为它表明这是一个测试方法。
2.7 [ExpectedException(typeof(OneSupportedException))] 属性
这个属性其实非常有用处,它表明这个函数会抛出一个预期的异常。在一个项目中,异常的处理是不可避免的。如果异常处理机制不好的话,会给程序带来相当大的混乱。也许你的程序充满了try,catch,但是确总也捕捉不到自己想要的异常。混乱的异常对于程序员来说就是灾难。
2.8 [Ignore("name")]属性
这个属性也挺有用处,它表示这个测试方法会被忽略掉。也许你的代码进行了一些升级,以前的测试方法已经不再重要,但是你仍然希望保留它们。那么你尽可以把它们标志成Ignore,然后统一放到一个文件或者Region中,以做存档之用。
2.9 [Platform("SupportedPlatform")]属性
这个属性也相当实用,它表明这个测试方法会运行在指定的平台上。大家都知道,.Net Framework就有几个版本,还有各种版本的Windows系统。不同的版本对于某些类库或者API的支持是不一样的。比如WMI查询语句的某些用法在Win2000上就无法通过测试。某些类库在.net1.1中无法找到,如果指定了平台,就一切都变得井井有条了。
2.10 [Category("NameOfCategory")]属性
这个属性也很好。但是在TestDriven中无法使用。它表明我们可以把某些测试归成一类(Category),我们可以给这个类别取个名字,然后可以指定是否对这个类别进行测试。假设你有个函数需要运行很长的时间,你肯定不希望每次都去运行它。那么你可以把它归到某个类别中,然后在NUnit的GUI中将它排除在测试范围之外。
2.11 [Explicit]属性
这个属性和Ignore有相似之处,但是也有不同。如果指定了这个属性,那么在测试的时候是不会运行的。但是如果你指定了它(比如你把鼠标放在这个方法上,然后选择RunTest)这个测试方法就会运行。它也非常有用处,对于某些你想暂时避过的测试,它是一个好的选择。
3 总结
其实NUnit的实际功能比我上面列举的强大得多。但是对于程序员自己单元测试来说,了解一些常用的属性就已经足够。TestDriven支持大部分属性,使用起来也非常的方便。而且TestDriven还能提供NCover这个分析的利器。你大可以为自己的应用程序创建一个工程,同时还为自己的测试代码创建一个工程,测试和开发同步进行。良好的单元测试一定可以提高程序的质量,同时也未必会耽误太多时间,延缓项目的进度。单元测试是如此的简单,也是如此的有用。希望上面的这些属性对大家有所帮助,能够提高大家的程序水平。