源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

nunit使用指南之—NUnit Quick Start

  • 时间:2020-08-18 00:26 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:nunit使用指南之—NUnit Quick Start
NUnit 是为 .NET 框架生成的开放源代码单元测试框架。NUnit 使您可以用您喜欢的语言编写测试,从而测试应用程序的特定功能。当您首次编写代码时,单元测试是一种测试代码功能的很好方法,它还提供了一种对应用程序进行回归测试的方法。NUnit 应用程序提供了一个用于编写单元测试的框架,以及一个运行这些测试和查看结果的图形界面。   下载地址:[url=http://sourceforge.net/projects/nunitaddin]http://sourceforge.net/projects/nunitaddin[/url]   本事例所用版本:[url=http://www.cnblogs.com/Files/young18/nunit2.3.rar]http://www.cnblogs.com/Files/young18/nunit2.3.rar[/url] [b][u]NUnit Quick Start[/u][/b] 原文档:http://www.nunit.org 翻 译:Young.J 说 明:该实例是最早期的nunit版本中找到,在测试驱动的开发中它并不是一个很好的例子,但它能阐明使用nunit的最基本方法。    现在开始我们的例子。假设我们开始写一个银行业的应用程序,我们有一个基类—Account,Account主要负责资金的增加,撤销和转帐,下面是该类的代码
 1[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] namespace bank  2[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] {  3[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     public class Account  4[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]     {  5[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]         private float balance;  6[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]         public void Deposit(float amount)  7[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]         {  8[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]               balance+=amount;      9[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]         } 10[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] 11[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]         public void Withdraw(float amount) 12[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]         {        13[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]               balance-=amount;      14[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]         } 15[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] 16[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]         public void TransferFunds(Account destination, float amount) 17[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]         {     } 18[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img] 19[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]         public float Balance 20[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]         {        21[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]               getreturn balance;}      22[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]         } 23[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]     } 24[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] }
    在我们来写一个需要测试的类—AccountTest,我们第一个测试的方法是TransferFunds
 1[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] namespace bank  2[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] {  3[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     using NUnit.Framework;  4[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]  5[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     [TestFixture]  6[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     public class AccountTest  7[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]     {  8[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]         [Test]  9[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]         public void TransferFunds() 10[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]         { 11[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]             Account source = new Account(); 12[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]             source.Deposit(200.00F); 13[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]             Account destination = new Account(); 14[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]             destination.Deposit(150.00F); 15[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]             source.TransferFunds(destination, 100.00F); 16[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]             Assert.AreEqual(250.00F, destination.Balance); 17[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]             Assert.AreEqual(100.00F, source.Balance); 18[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]         } 19[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]     } 20[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] }
   现在做的第一件事是声明这个类有一个[TestFixture]属性,通过这种方法显示这个类包含测试代码(此属性可以被继承),这个类必须是public类且其派生内没有限制,这个类当然必须有一个默认构造函数。    这个类仅有的一个方法—TransferFunds,有一个[Test]属性,显示他是一个测试方法,该方法返回void,没有参数,在这个方法里我们对测试对象作了必须的初始化,Assert类定义了一些方法的集合体,用它来检测设置条件,在我们的例子中,我们用AreEqual方法确保后面两个账户的转帐都有一个正确的剩余资金(这些是一些重载方法,这个例子中用的版本包含下面几个参数,第一个参数是期望值,第二个参试是真实值),   编译运行这个例子,假设你编译你的代码为bank.dll,运行NUnit Gui,选择File->Open menu item,载入刚才编译过的dll文件,点击run,我们可以看到测试条变成红色—我们的测试失败了,在“Errors and Failures”面板显示一面信息:        TransferFunds : expected <250> but was <150>   这个现象是我们所期望的,测试失败的原因是我们没有实现TransferFunds方法,现在我们开始让它工作,修改你的TransferFunds方法如下:
1[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] public void TransferFunds(Account destination, float amount) 2[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] { 3[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     destination.Deposit(amount); 4[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     Withdraw(amount); 5[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] }
  现在我们再次编译代码,并在GUI中运行,我们何以看到测试条变绿!测试成功!   我们增加一些错误检测在我们的Account代码中,为balance设置一个最小值.依次来保护资金透支量
1[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] private float minimumBalance = 10.00F; 2[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] public float MinimumBalance 3[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] { 4[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]     getreturn minimumBalance;} 5[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] }
  增加一个表明透支的异常;
1[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] public class InsufficientFundsException : ApplicationException 2[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] { 3[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] }
  增加一个测试方法到AccountTest类中
 1[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] [Test]  2[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] [ExpectedException(typeof(InsufficientFundsException))]  3[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] public void TransferWithInsufficientFunds()  4[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] {  5[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     Account source = new Account();  6[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     source.Deposit(200.00F);  7[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     Account destination = new Account();  8[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     destination.Deposit(150.00F);  9[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     source.TransferFunds(destination, 300.00F); 10[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] }
  这个测试方法的[Test]属性有一个 [ExpectedException]属性,这表明这段测试代码期望得到某一类型的异常,如果这种异常没有出现在执行过程中,这车是失败,现在编译代码,启动NUnit Gui,这是测试条变红,提示错误信息:         TransferWithInsufficentFunds : InsufficientFundsException was expected   让我们重新配置Account的代码,让它抛出异常,按下面的实例修改TransferFunds方法.
1[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] public void TransferFunds(Account destination, float amount) 2[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] { 3[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     destination.Deposit(amount); 4[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     if(balance-amount < minimumBalance) 5[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]         throw new InsufficientFundsException(); 6[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     Withdraw(amount); 7[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] }
  编译,运行测试-测试条变绿,成功了,但是,我们看看这个代码,我们仅仅写了我们可以看到的转帐操作中的错误,现在让我们来写一个测试来证实我们不确定的错误,添加下面一个测试方法
 1[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] [Test]  2[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] public void TransferWithInsufficientFundsAtomicity()  3[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] {  4[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     Account source = new Account();  5[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     source.Deposit(200.00F);  6[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     Account destination = new Account();  7[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     destination.Deposit(150.00F);  8[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     try  9[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]     { 10[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]         source.TransferFunds(destination, 300.00F); 11[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]     } 12[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     catch(InsufficientFundsException expected) 13[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif[/img]     { 14[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]     } 15[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     Assert.AreEqual(200.00F,source.Balance); 16[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     Assert.AreEqual(150.00F,destination.Balance); 17[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] } 
  编译运行—红色测试条,我们算错了300元,代码显示正确的结果是150元,但账户显示确是450,那么怎样修补错误,能不能加一段最小基金检测在资金处理之前呢?我们可以在catch块中加以一些修补方法,或依靠我们的管理人员修复对象的规定,我们需要在多方面回答这些问题,但不是在现在,那在此期间我们可以怎么做呢?移出它?一个最好的方法是忽视它,添加以下属性在你的测试方法中
1[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] [Test] 2[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] [Ignore("Decide how to implement transaction management")] 3[img]http://www.cnblogs.com/Images/OutliningIndicators/None.gif[/img] public void TransferWithInsufficientFundsAtomicity() 4[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif[/img] [img]http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif[/img] { 5[img]http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif[/img]     // code is the same 6[img]http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img] }
   编译测试代码—黄色,点击"Tests Not Run",我们可以看到bank.AccountTest.TransferWithInsufficientFundsAtomicity() 在被忽视的测试列表里。   上面是一些常用简单方法,依次来讲解nunit的使用过程,在以后的单元,我们会深入讲解nunit的使用!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部