我们在编写代码的过程中有时会遇到这样的情况:在代码编辑器中写好代码后编译全部通过,但是最后进行测试时却不好用,因为所编写的代码不能满足实际业务的需要。这要求我们必须针对业务进行编写代码,并且在提交代码前先由程序员个人进行单元测试,我们可以利用NUnit来实现这一点。

Nunit的一个特点就是先写测试后写代码,从而保证所写的代码可以满足业务的需求。下面简单介绍一个小例子:

假设有这样一个需求,要求写一个关于票务信息的类Ticket,在这个类Ticket中要实现两个方法,一个是当有人买票时自动减少票的数量,用到一个selltick方法,另一个是当有人退票时自动增加票的数量,或者在开始卖票前也要先记录总共的票数,用到一个addTick方法。

首先我们建立一个控制台应用程序TickTest,在它的类Class1中暂时不写代码,然后为项目添加一个类文件(dealEvent)。

dealEvent类中我们首先要添加对NUnit的引用,将nunit.framework.dll引入工程,然后在dealEvent中加入[TetstFixture],并在要测试的方法前加入[Test] 这样测试框架可以知道要对哪些类和方法进行测试

using System;
using NUnit.Framework;
namespace TickTest
{
    
/// <summary>
    
/// dealEvent 的摘要说明。
    
/// </summary>
    [TestFixture]
    
public class dealEvent
    {
        
public dealEvent()
        {
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }
    }
}
 

下面我们开始根据需要编写测试的方法。首先在dealEvent类加入一个测试用的方法,这个方法用来测试添加票的数量

[Test]
        
public void add()
        {
            Ticket ticket
=new Ticket();
            ticket.addTicket(
10);
            Assertion.AssertEquals(
10,ticket.Amount);
        }
 

使用Assertion.AssertEquals(10,ticket.Amount)是为了测试此时ticket的Amount属性是否为10;

接下来再加入另外一个方法,用来测试卖票后减少票的数量

[Test]
        
public void sell()
        {
            Ticket ticket
=new Ticket();
            ticket.addTicket(
10);
            ticket.selltick();
            ticket.selltick();
            Assertion.AssertEquals(
8,ticket.Amount);
        }

 

同样使用Assertion.AssertEquals测试此时Amount属性是否为8

这里我们每执行一次selltick就减少一张票

这样我们就完成了对两个所要实现的方法的测试,然后我们根据要求加入下面的代码

public class Ticket
        {
            
private int amount;
            
public int Amount
            {
                
get
                {
                    
return amount;
                }
            }
            
public void addTicket(int num)
            {
            }            
            
public void selltick()
            {
            }
        }
 

上面这段代码我们只完成了类的结构,方法暂时先不实现。将项目进行编译,通过。

运行NUnit测试工具,打开编译后的TickTest.exe文件(这里建立的是控制台应用程序,如果直接用一个类文件的话就是一个.dll文件),这时我们可以在测试工具的图形界面左侧看到以树形列出了我们要测试的类和方法。点击“run”按钮,我们可以看到界面内add和sell两个方法都是红色,表示出错,这是由于我们没有实现addTicket和selltick这两个方法造成的。

下面我们在addTicket方法中加入代码

public void addTicket(int num)
            {
                amount
+=num;
        }

 

编译后切换到NUnit,再点击“Run”运行,可以看到add方法变成绿色,表示这个方法已经测试通过,也就说明addticket方法是正确的。

接着在selltick方法中加入代码

public void selltick()
            {
                amount
-=1;
        }
 

编译后切换到NUnit,点击“Run”运行,sell方法通过,selltick方法正确。

由于我们的测试代码完全是按照业务需求编写的,因此这时测试的通过说明我们的Ticket类完全符合要求,我们只要删除掉两个测试类保留所需的内容就可以了。为了进一步显示结果我们在这里返回类Class1加入下面代码:

class Class1:dealEvent
    {
        [STAThread]
        
static void Main(string[] args)
        {
            Ticket ticket
=new Ticket();
            ticket.addTicket(
10);
            ticket.selltick();
            Console.WriteLine(
"the rest of tickets are "+ticket.Amount);
        }
}

 

使用Ctrl+F5运行程序,界面内显示

The rest of tickets are 9

结果完全正确

 

使用单元测试工具虽然看起来好像有些麻烦,但是通过这样的测试可以确保程序的正确性,减少开发后期的反复测试甚至出现代码不符合业务要求的情况。使用熟练以后可以在很大程度上提高程序员个人的开发效率,从而保证整个项目的顺利进行!

    以上是个人在使用NUnit时做的一个小小的总结,里面的内容肯定不是很完善也可能有理解不对的地方,欢迎大家指正啊. ^_^