纵观软件的开发,测试已经日益成为软件开发过程中的重要环节,通常一个软件的开发周期中测试要占到一半时间甚至更多。而在测试过程中,单元测试更是万里长征第一步,单元测试进行得是否完善,直接影响到后期集成测试的效率。进行单元测试,有许多软件可以自动完成, NUnit 就是其中之一。这是一款与 JUnit 齐名的,同属于 xUnit 家族的单元测试软件(在 http://www.NUnit.org 可以免费得到这款软件)。本文来自于这款软件的 QuickStart 教程。
让我们从一个简单的例子开始。假设我们正在编写一个银行应用程序,而我们有一个这一领域的基本类—— 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 中继续工作并写更多的测试)。
=======未完待续=======