zoukankan      html  css  js  c++  java
  • 开源单元测试工具 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特性总结下。

  • 相关阅读:
    HDU 3586 Information Disturbing (树形DP,二分)
    HDU 4274 Spy's Work (树形DP,模拟)
    HDU 4276 The Ghost Blows Light (树形DP,变形)
    ZOJ 3627 Treasure Hunt II (贪心,模拟)
    ZOJ 3626 Treasure Hunt I (树形DP,常规)
    POJ 2104 K-th Number (区间第k大)
    HDU 4044 GeoDefense (树形DP,混合经典)
    POJ 2486 Apple Tree (树形DP,树形背包)
    HDU 4003 Find Metal Mineral (树形DP,经典)
    TinyMCE
  • 原文地址:https://www.cnblogs.com/forcertain/p/2208771.html
Copyright © 2011-2022 走看看