Nunit是.net平台下的单元测试框架,来自于junit,同属于xunit的一员,现在正式发布的版本已经更新到2.5.10,如果还没有安装的可以去下载,nunit官网.尽管现如今的vs已经集成了自己的单元测试,用起来还是相当的方便,但是我们了解一些.net平台下的源的项目时或一些示例时,测试框架无不是nunit,因此对nunit进行一些了解还是非常必须的。
开始
当你安装之后,会有两种不同的方式来运行你的的测试。控制台运行nunit-console.exe,运行最快,但是不利于交互;图形运行nunit.exe,一个win form的应用程序,提供一个图形界面,让你更直观的控制你的测试运行。
安装完之后,那就在你现在项目中建一个测试的项目吧,与vs集成的测试新建一个单元测试的项目不一样的,nunit需要新建一个类库的项目,然后引用你要测试的项目和nunit框架程序集nunit.framework.dll,这样就可以开始自己的测试代码了。
运行和配置
首先编译你的测试项目,运行nunit.exe,打开图形界面,选择你的测试dll,点击run,就可以获得一个很直观的反馈,直观到不解释。
当你运行nunit.exe 或者nunit-console.exe时,其实都有对应的配置文件nunit.exe.config 和 nunit-console.exe.config来控制它们的运行行为。这些配置文件的一个主要用处是决定nunit运行基于的CLR的版本。nunit的编译用1.1和2.0的版本的,这两个版本提供了分开的下载,但是其中任一都可以基于其它版本远行。
但是这些配置只不会影响到你的测试项目,如果想要对你的某个项目进行一些控制,那么请在测试项目对应的如test.dll同目录下建立test.dll.config的配置文件,你的文件的格式应如:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="NUnit"> <section name="TestCaseBuilder" type="System.Configuration.NameValueSectionHandler"/> <section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/> </sectionGroup> </configSections> <NUnit> <TestCaseBuilder> <add key="OldStyleTestCases" value="false" /> </TestCaseBuilder> <TestRunner> <add key="ApartmentState" value="MTA" /> <add key="ThreadPriority" value="Normal" /> <add key="DefaultLogThreshold" value="Error" /> </TestRunner> </NUnit> ... </configuration>
对于其中的配置节点,如果 OldStyleTestCases 为true时,nunit会把所有以test…开始的方法认为是测试,这个前缀不区分大小写。ApartmentState是用来设置运行测试的线程的单元状态。ThreadPriority设置测试线程的优先级。DefaultLogThreshold设置被nunit捕获用于记录日志的错误级别,这个级别必须是log4net中定义的级别。
更多的运行和配置细节请查看:http://www.nunit.org/index.php?p=runningTests&r=2.5.10
示例
单元测试的简单入门示例,就贴一个官方文档上的示例吧,很具有代表意义,看了之后,应付一个简单测试可以画瓢了。
假如我们的一个银行系统,实现了基本的存钱、取钱和转账的功能。
namespace bank { public class Account { private float balance; public void Deposit(float amount) { balance+=amount; } public void Withdraw(float amount) { balance-=amount; } public void TransferFunds(Account destination, float amount) { } public float Balance { get{ return balance;} } } }
下面我们写一个简单的测试类:
namespace bank { using NUnit.Framework; [TestFixture] public class AccountTest { [Test] public void TransferFunds() { Account source = new Account(); source.Deposit(200.00F); Account destination = new Account(); destination.Deposit(150.00F); source.TransferFunds(destination, 100.00F); Assert.AreEqual(250.00F, destination.Balance); Assert.AreEqual(100.00F, source.Balance); } } }
我们看到,我们的AccountTest类应用了一个TestFixture的特性,它指示我们的类里面有测试的代码,另外它是可以被继承的。它要求我们测试类必须的公开的并且没有约束条件在超类上,还必须有一个默认的构造器。
同样我们的测试方法TransferFunds也应用一个Test的特性,它指示我们的方法是一个测试方法,这个测试方法必须是返回void,并且是无参的。在我们的测试方法中,我们要初始化要求的对象,然后运行要被测试的代码,然后检验得到的结果和我们预期的结果。检验结果我们用到断言,这是Nuint的一个核心特性,将在以后的文章中介绍。这里我们用到了Assert.AreEqual,它要求两个参数:第一个是我们预期的结果,第二个代码运行的结果。
此时我们第一个示例也就完成了,就可以运行了。
E文好的可以看unit官方提供的经典示例:http://www.nunit.org/index.php?p=quickStart&r=2.5.10
当然也有对应的中文版:http://www.36sign.com/nunit/quickStart.html
这一篇先写到这,以后会把Nunit的重要特性:Assertions断言,constraints约束,attributes特性总结下。