以前在大学的时候有知道过JUnit,不过没用过,sigh。。。我的大学都被我给荒废了。因为那 时候看 老师有在他的笔记本上用过,但是感觉蛮麻烦的。现在想起来,真的是。。。其实,技术没有什么难的,just do it。一个简单的sample就可以帮助你入门了。恩。这也就是我为什么写这篇文章的原因了。
首先来简单介绍一下单元测试吧,因为NUnit就是用来进行单元测试的,它的作用就是帮助你方便的完成单元测试工作,同鼎鼎有名的JUnit一样,都是xUnit家族的成员。单元测试是众多测试中的一种,是所有测试中的第一个环节,也是最重要的一个环节。单元测试是一种由程序员自行测试的工作。简单点说,单元测试就是测试代码撰写者依据其所设想的方式执行是否产生了预期的结果。
开始进入正题。
本文举一个银行账号的例子,这里,我们假设只可以对账号进行两个操作,存钱(deposit)和取钱(withdraw)。第一个Class版本如下:
using System;
namespace xUnit
{
public class Account
{
private int money;
public int Value
{
get
{
return money;
}
}
public void Deposit(int v)
{
money += v;
}
public void Withdraw(int v)
{
amount -= v;
}
}
}
这个类是要被测试的类,也就是我们要写的类。我们就要针对这个类来写测试类,也就是测试用例。测试类如下。注意,本solution是创建一个class library的,也就是dll了。
using System;
using NUnit.Framework;
namespace xUnit
{
[TestFixture]
public class testclass
{
[Test]
public void testcase1()
{
Account ac = new Account();
ac.Deposit(10000);
Assert.AreEqual(10000, ac.Value);
}
[Test]
public void testcase2()
{
Account ac = new Account();
ac.Deposit(10000);
ac.Withdraw(1000);
ac.Withdraw(1000);
ac.Withdraw(1000);
Assert.AreEqual(7000, ac.Value);
}
}
}
这个测试类与一般的类不同的是多了如下几行:
using NUnit.Framework;
[TestFixture]
[Test]
其中NUnit.Framework是NUnit的Assembly,因此我们必须reference到nunit.framework.dll这个dll,它在NUnit的安装目录下的bin子目录下。加reference,通过Project/Add Reference/Browse,然后选择nunit.framework.dll。
[TestFixture],[Test],这两个Attribute是NUnit所规定必须要添加的,否则,测试框架就不知道哪个是测试类,也找不到测试用例了。另外,我们必须加上Assert来判断结果是否正确,否则NUint就无法检测到是否出错了。
接下来,我们就可以开始运行NUnit-GUI来进行测试了。打开NUnit的GUI界面,打开我们编译出来的那个dll。然后,NUnit就会自动识别出我们的测试用例了,testcase1,testcase2。接着我们点击run来运行测试用例。如果进度条是绿色的话表示test case通过,如果是红色的话表示fail。很显然我们上面的那个account类是写的不够强壮的,我们可以通过边界来测试出这个问题,因为money是不能为负的negative。因此我们通过写单元测试用例就可以非常方便的测试出这个问题来了。
如果每个测试用例都自己来写的话,那不是很麻烦吗?一开始的时候我是这么觉得。后来我想起了以前参加笔试的时候。。。有些笔试题就是要我们为某个函数写出测试用例!那时候对那种题目非常茫然,感觉相当的傻,能有啥用?呵呵,现在终于有它的用处了,那就是来编写我们的单元测试的测试用例。Over了,希望没有写得不清楚。