【简介】
在.NET平台下进行单元测试,我们首先想到的应该是NUnit。NUnit是一个专门针对.NET的单元测试框架,也是.NET平台上使用得最为广泛的测试框架之一。
在NUnit之前,有针对Java的JUnit,针对C++的CPPUnit,它们都属于xUnit家族。NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等,最重要的一点是它适合于所有.NET语言。
关于NUnit的安装以及简单运用,在这里不做过多的描述。详情请移步《单元测试——NUnit工具安装及简单运用》
下边,我们先看一个非常简单的测试用例(TestCase):
<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>[Test]
public void AdditionTest()
{
int expectedResult = 2;
Assert.AreEqual(exptectedResult, 1 + 1);
}</strong></span>
也许,这个TestCase在很多人看来很低级,但是我的理解并不是这样。NUnit本来就是编写单元测试的简易框架,单元测试的复杂之处在于如何在实际项目中应用和实施,而不是徘徊于如何使用NUnit。
【Demo】
下边,我们通过一个Demo,来了解一下在单元测试中如何使用NUnit。
使用NUnit做单元测试,可以使用它的客户端,也可以在VS中安装“Nunit Test Adapter”插件,这样测试的结果可以在VS中可视化。
在本文中我们使用Nunit Test Adapter插件,来查看测试结果。
加减乘除的Demo框架基本上是这样的:
1、首先,新建一个类库:Caluclate。然后编写其中的代码(加减乘除的例子)
<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Caluclate
{
//加减乘除运算实例
public class Calculate
{
//控制台应用程序,程序的入口
static void Main(string[] args)
{
}
//无参构造函数
public Calculate() { }
#region 加减乘除运算的具体实现
/// <summary>
/// 加法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public int Add(int a, int b)
{
return a + b;
}
/// <summary>
/// 减法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public int Subduction(int a, int b)
{
return a - b;
}
/// <summary>
/// 乘法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public int Multiply(int a, int b)
{
return a * b;
}
/// <summary>
/// 除法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public int Divide(int a, int b)
{
if (b == 0)
{
Console.WriteLine("除数不能为零!");
return 0;
}
else
{
return a / b;
}
}
#endregion
}
}
</strong></span>
2、然后是测试类(CaluclateTest)
在测试类CaluclateTest中,我们需要添加对NUnit的引用:
然后进行测试类CaluclateTest代码的编写:
<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework; //添加对NUnit服务的引用
using Caluclate; //导入“被测试类”的命名空间
namespace CaluclateTest
{
[TestFixture] //单元测试的关键字
//作为一个测试类,
//1、必须是public,否则NUnit看不到它的存在
//2、必须有一个缺省的构造函数,否则NUnit不会构造它
public class CaluclateTest
{
[Test] //Test作为标识符、关键字
//测试方法必须没有参数,并且不返回任何参数,且必须为public。
public void TestAdd()
{
//对象实例化
Calculate add = new Calculate();
//利用测试数据,对加法进行测试
int result = add.Add(2, 3);
//设置断言:5为expected期望值;result为actual真实值
Assert.AreEqual(5, result);
}
//[Test]可以扩展写成[Test(Description="")],对本测试进行简单的描述
[Test(Description = "减法Subduction()测试")]
public void TestSubduction()
{
Calculate subduction = new Calculate();
int result = subduction.Subduction(8, 5);
//我们在这里,将4设置成我们的expected期望值
//Assert.AreEqual(4, result);
Assert.AreEqual(3,result);
}
}
}
</strong></span>
3、然后,进行测试
测试代码中,关于断言Asser的使用,可以参考下边这张表,表中是经常用到的一些断言。
在这里,只是抛砖引玉,更多关于断言的东西,请移步《NUnit断言大全》
【后记】
原来没有接触单元测试之前,那仿佛好像是一个很遥远、很神秘的东西,一直无法触及。经过最近几天的了解,发现单元测试并不是我们想象中的那样,我们要想写出出色的代单元测试必须陪伴我们左右。
陌生的东西不可怕,因为我们有一颗去探索它的心。