开源单元测试工具 Nunit

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特性总结下。

posted @ 2011-10-12 16:21  for certain  阅读(790)  评论(1编辑  收藏  举报