开源单元测试工具 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特性总结下。

你可能感兴趣的:(单元测试)