纵观软件的开发,测试已经日益成为软件开发过程中的重要环节,通常一个软件的开发周期中测试要占到一半时间甚至更多。而在测试过程中,单元测试更是万里长征第一步,单元测试进行得是否完善,直接影响到后期集成测试的效率。进行单元测试,有许多软件可以自动完成,NUnit就是其中之一。这是一款与JUnit齐名的,同属于xUnit家族的单元测试软件(在http://www.NUnit.org我们可以免费得到这款软件)。
[正文]
让我们从一个简单的例子开始。假设我们正在编写一个航班管理应用程序,假设有这么一个方法——TransLinkFlightNo()。具体看注释:
待测试方法:(ComFunction.cs)
using
System;
using
System.Collections;
using
System.Text;
using
System.Data;
/**/
/// <summary>
/// 将完整的航班联线航班号转化为简化的航班联线航班号
/// LeeWenjie -- 2005-08-16
/// </summary>
/// <param name="P_str">完整航班联线航班号</param>
/// <returns>简化航班联线航班号</returns>
public
static
string
TransLinkFlightNo(
string
P_str )
{
if ( P_str.Length <= 0 )
return "";
string[] strSch = P_str.Split('/');
StringBuilder RtnSchLine = new StringBuilder(25); //返回航班联线 --LeeWenjie
if ( strSch.Length >= 1 )
RtnSchLine.Append( strSch[0] );
for ( int i=1; i < strSch.Length ; i++ )
{
if ( strSch[i].Length > 0)
{
if ( String.Compare( strSch[i-1],0,strSch[i],0,4,true) == 0 )
{
// 判断相邻的两个航班号是否相等 -- LeeWenjie 2005-08-15
// 不相等时添加,否则不添加
if ( strSch[i].Length <=6 && String.Compare( strSch[i-1],0,strSch[i],0,6,true) != 0)
{
RtnSchLine.Append("/");
RtnSchLine.Append(strSch[i].Substring(4));
}
else
{
for (int j = 4;j<strSch[i].Length;j++)
{
if ( String.Compare( strSch[i-1],j,strSch[i],j,1,true) != 0)
{
RtnSchLine.Append("/");
RtnSchLine.Append(strSch[i].Substring(j));
break;
}
}
}
}
else
{
RtnSchLine.Append("/");
RtnSchLine.Append(strSch[i].Substring(2));
}
}
}
return RtnSchLine.ToString() ;
}
测试类:(Test.cs)
using
System;
using
System.IO;
using
System.Configuration;
using
NUnit.Framework;
/**/
/// <summary>
/// ComFunctionsTesting 测试 ComFunctions 类方法
/// LeeWenjie 2005-08-16
/// </summary>
[TestFixture]
public
class
ComFunctionsTesting
{
[Test]
public void TransSchLineTest()
{
string strFileName = @"..\..\ComFunctionsTesting.txt";
if ( !File.Exists( strFileName ) )
{
throw new Exception("请设置测试文件,谢谢!" );
}
StreamReader sr = new StreamReader(strFileName);
string NextLine = "";
while ( (NextLine = sr.ReadLine() ) != null )
{
if ( NextLine.Substring(0,1) != "#" )
{
string[] strArgs = NextLine.Split(',');
Assert.AreEqual(strArgs[0],ComFunction.TransLinkFlightNo( strArgs[1] ));
}
}
sr.Close();
}
}
测试用例:(ComFunctionsTesting.txt)
(#:注释语句;测试用例以","分隔,左边为结果期望值,右边为测试输入值)
(当然,也可以将该文档写成XML文档,可以输入列多的测试信息)
#
----------------------------------------------------------------
# 文件名称:ComFunctionsTesting.txt
# 功能描述:ComFunctions类 TranSchLine 方法的测试用例
#
--
# 为注释行
#
--
文档不能有空行
--
LeeWenjie
2006
-
03
-
23
# Create :LeeWenjie
2005
-
08
-
16
#
---------------------------------------------------------------
#
# 返回值,输入值
#
MF1001
/
11
,MF1001
/
MF1011
MF831
/
2
,MF831
/
MF832
MF8115
/
8225
/
26
/
8116
,MF8115
/
MF8225
/
MF8226
/
MF8116
MF1087
/
88
,MF1087
/
Mf1088
Mf1087,Mf1087
MF8577
/
88
,MF8577
/
MF8577
/
MF8588
/
MF8588
MF8577
/
66
/
88
,MF8577
/
MF8577
/
MF8566
/
MF8588
/
MF8588
MF8577
/
66
/
88
,MF8577
/
MF8577
/
MF8566
/
MF8588
/
MF8588
/
# 新七位航班号
--
LeeWenjie
MF8304A
/
B,MF8304A
/
MF8304B
MF8304A
/
5B,MF8304A
/
MF8305B
MF8304A
/
B
/
C,MF8304A
/
MF8304B
/
MF8304C
MF8304A
/
5B
/
6C,MF8304A
/
MF8305B
/
MF8306C
MF8304A
/
5A
/
6A,MF8304A
/
MF8305A
/
MF8306A
MF831
/
01A,MF831
/
MF8301A
# END
首先要注意的是这个类关联了一个[TestFixture]特性(attribute)——这表示这个类包含了测试代码(这个特性可以被继承)。这个类必须是公有的,但他的父类并不受限制。这个类还必须有一个默认构造函数。
编译并运行这个例子。假设你已经将你的测试代码编译为ComFuntion.dll。打开NUint Gui(安装程序会在你的桌面和“程序”菜单中建立一个快捷方式),打开GUI后,选择File->Open菜单项,找到你的ComFuntion.dll并在“Open”对话框中选中它。ComFuntion.dll装载后你会在左边的面板中看到一个测试树结构,还有右边的一组状态面板。
单击Run按钮,状态条和测试树种的TransLinkFlightNo节点变成了红色——我们的测试失败了。
“Errors and Failures”面板显示错误消息,
在它正下方的堆栈跟踪面板报告了测试失败的语句在代码中的位置.
如果测试结果和期望的一样时,节点变绿.
--------------------------------------------------------------------------------------------------
--LeeWenjie 2006-09-11
[email protected]