前往顾页
以后地位: 主页 > 收集编程 > .Net实例教程 >

NUnit疾速入门根本教程

时候:2011-04-08 13:31来源:知行网www.zhixing123.cn 编辑:麦田守望者

让我们从一个简朴的例子开端。假定我们正在编写一个银行利用法度,而我们有一个这一范畴的根基类——Account。Account支撑存款、存款和资金转帐。这个Account类看起来会是这个样子:



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;}

}

}

}



现在我们来为这个类写一个测试——AccountTest。我们要测试的第一个类体例是TransferFuncs。



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);

}

}



}



起首要重视的是这个类关联了一个[TestFixture]特性(attribute)——这表示这个类包含了测试代码(这个特性可以被继承)。这个类必须是公有的,但他的父类其实不受限定。这个类还必须有一个默许机关函数。



类中独一的一个别例——TransferFunds,关联了一个[Test]特性——这表示它是一个测试体例。测试体例的前往值必须为void并且不克不及带有参数。在我们的测试体例中,我们对被测试的工具进行了一般的初始化,履行了被测试的体例并查抄了工具的状况。Assert类定义了一组体例用于查抄给定的前提,在我们的例子中我们利用了AreEqual体例来确保生意过后两个账户都有精确的余额(这个别例有很多重载,我们在这个例子中利用的版本带有两个参数:第一个参数是我们的希冀值,第二个参数是实际值)。



编译并运行这个例子。假定你已将你的测试代码编译为bank.dll。翻开NUint Gui(装置法度会在你的桌面和“法度”菜单中建立一个疾速体例),翻开GUI后,挑选File->Open菜单项,找到你的bank.dll并在“Open”对话框当选中它。bank.dll装载后你会在左边的面板中看到一个测试树布局,另有右边的一组状况面板。单击Run按钮,状况条和测试树种的TransferFunds节点变成了白色——我们的测试失败了。“Errors and Failures”面板显现以下动静——“TransferFunds: expected <250> but was <150>”,在它正下方的堆栈跟踪面板陈述了测试失败的语句在代码中的地位——“at bank.AccountTest.TransferFunds() in C:\nunit\BankSampleTests\AccountTest.cs:line 17”



这恰是预期的成果,因为我们还未实现TransferFunds体例。现在我们来搞定它。不要封闭GUI,回到你的IDE并点窜代码,使你的TransferFunds体例看起来像如许:



public void TransferFunds(Account destination, float amount)

{

destination.Deposit(amount);

Withdraw(amount);

}



现在从头编译你的代码并再次在GUI中点击Run按钮——状况条和数节点变绿了。(重视GUI会主动地为你从头加载法度集;我们可以一向开着GUI而在IDE中继续事情并写更多的测试)。





让我们来为我们的Account的代码增加一些错误检测。为账户增加一个最小余额限定,经由过程你的最小透支庇护费来保持它的持续运作。起首我们来为Account类增加一个最小余额庇护属性:



private float minimumBalance = 10.00F;

public float MinimumBalance

{

get{ return minimumBalance;}

}



我们利用一个异常来指出透支:



namespace bank

{

using System;

public class InsufficientFundsException : ApplicationException

{

}

}



向我们的AccountTest类增加一个新的体例:



[Test]

[ExpectedException(typeof(InsufficientFundsException))]

public void TransferWithInsufficientFunds()

{

Account source = new Account();

source.Deposit(200.00F);

Account destination = new Account();

destination.Deposit(150.00F);

source.TransferFunds(destination, 300.00F);

}



这个测试体例除[Test]特性以外还关联了一个[ExpectedException]特性——这指出测试代码希望抛出一个指定范例的异常;如果在履行过程中没有抛出如许的一个异常——该测试将会失败。编译你的代码并回到GUI。因为你编译了你的测试代码,GUI会变灰偏重构了测试树,仿佛这个测试还没有被运行过(GUI可以监督测试法度集的转变,并在测试树布局产生转变时进行更新——比方,增加了新的测试)。点击“Run”按钮——我们又一次获得了一个白色的状况条。我们获得了下面的失败动静:“TransferWithInsufficentFunds: InsufficientFundsException was expected”。我们来再次点窜Account的代码,象下面如许点窜TransferFunds体例:



public void TransferFunds(Account destination, float amount)

{

destination.Deposit(amount);

if(balance-amount<minimumBalance)

throw new InsufficientFundsException();

Withdraw(amount);

}



编译并运行测试——绿了。成功!不过等等,看看我们刚写的代码,我们会发明银行在每笔不成功的转账操纵时都亏钱了。让我们来写一个测试来确认我们的猜想。增加这个测试体例:

 

[Test]

public void TransferWithInsufficientFundsAtomicity()

{

Account source = new Account();

source.Deposit(200.00F);

Account destination = new Account();

destination.Deposit(150.00F);

try

{

source.TransferFunds(destination, 300.00F);

}

catch(InsufficientFundsException expected)

{

}



Assert.AreEqual(200.00F,source.Balance);

Assert.AreEqual(150.00F,destination.Balance);

}



我们测试了体例的生意属性——是不是所有的操纵都成功了。编译并运行——红条。是的,我们平白无故地丧失了300块钱——source账户有精确的余额150.00,但destination账户显现:$450.00。我们该若何点窜?我们可以或许只将最小余额查抄的调用放到数据更新的前面么:



public void TransferFunds(Account destination, float amount)

{

if(balance-amount<minimumBalance)

throw new InsufficientFundsException();

destination.Deposit(amount);

Withdraw(amount);

}



如果Withdraw()体例抛出了别的一个异常呢?我们应当在catch块中履行一个挽救措置,还是依靠我们的生意办理器来从头装载工具的状况?某些时候我们必须答复如许的问题,但不是现在;可我们眼前若何应付这个失败的测试呢——删除它?一个不错的体例是临时忽视它在你的测试体例中增加下面的特性:

 

[Test]

[Ignore("Need to decide how to implement transaction management in the application")]

public void TransferWithInsufficientFundsAtomicity()

{

// code is the same

}



编译并运行——黄条。单击“Test Not Run”选项卡,你会看到bank.AccountTest.TransferWithInsufficientFundsAtomicity()连同这个测试被忽视的启事一路列在列表中。

顶一下
(0)
0%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):ASP.NET asp.Net实例教程 asp.net源代码 asp.net根本教程
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣