这里Init和Dispose方法没什么好说的,是执行了对book对象的初始化和清理,不过testId和testName需要说明一下。前者是在对book的id属性进行测试,首先赋值为”001”,然后使用Assert的AreEqual方法查看id属性中存放的值是否是期待的值,由于我的期待值也是”001”,所以执行后这个用例应该是成功的;后者则是对book的name属性进行测试,也是首先赋值为”ASP”,然后使用Assert的AreEqual方法查看其值是否是期待的,由于我特意将期待值设定为根本不可能的”JSP”,因此这个用例执行后会出现一个错误。
下面简单介绍一下静态类NUnit.Framework.Assert。该类主要包含20个方法:
1.AreEqual()和AreNotEqual(),各18个重载,用来查看两个对象的值是否相等或不等,与对象比较中使用的Equals()方法类似。
2.AreSame()和AreNotSame(),各3个重载,用来比较两个对象的引用是否相等或不等,类似于通过“Is”或“==”比较两个对象。
3.Contains(),3个重载,用来查看对象是否在集合中,集合类型应与System.Collections.IList兼容。示例:
VB代码:
Dim o As New Object
Dim al As New ArrayList
al.Add(o)
Assert.Contains(o, al)
C#代码:
object o = new object();
ArrayList al = new ArrayList();
al.Add(o);
Assert.Contains(o, al);
J#代码:
Object o = new Object();
ArrayList al = new ArrayList();
al.Add(o);
Assert.Contains(o, al);
4.Greater()和Less(),各18个重载,用来比较两个数值的大小,前者相当于大于号(>),后者相当于小于号(<)。
5.IsInstanceOfType()和IsNotInstanceOfType(),各3个重载,用来判断对象是否兼容于指定类型。示例:
VB代码:
Dim t As Type = New Object().GetType
Dim s As String = ""
Assert.IsInstanceOfType(t, s)
C#代码:
Type t = new object().GetType();
tring s = "";
Assert.IsInstanceOfType(t, s);
J#代码:
Type t = new Object().GetType();
String s = "";
Assert.IsInstanceOfType(t, s);
由于Object是.net中所有类型的基类,String类型兼容于Object,因此这个示例是能够运行通过的。而下边这个示例运行将是失败的:
VB代码:
Dim t As Type = New ArrayList().GetType
Dim s As String = ""
Assert.IsInstanceOfType(t, s)
C#代码:
Type t = new ArrayList().GetType();
string s = "";
Assert.IsInstanceOfType(t, s);
J#代码:
Type t = new ArrayList().GetType();
String s = "";
Assert.IsInstanceOfType(t, s);
6.IsAssignableFrom()和IsNotAssignableFrom(),各3个重载,用来判断对象是否是指定类型的实例。示例:
VB代码:
Dim t As Type = New Object().GetType
Dim s As String = ""
Assert.IsAssignableFrom(t, s)
C#代码:
Type t = new object().GetType();
string s = "";
Assert.IsAssignableFrom(t, s);
J#代码:
Type t = new Object().GetType();
String s = "";
Assert.IsAssignableFrom(t, s);
这个示例与之前的示例是一样的,但由于字符串s不是Object类型的,因此无法运行通过。而下边这个实例可以运行通过:
VB代码:
Dim t As Type = "".GetType
Dim s As String = ""
Assert.IsAssignableFrom(t, s)
C#代码:
Type t = "".GetType();
string s = "";
Assert.IsAssignableFrom(t, s);
J#代码:
Type t = "".GetType();
String s = "";
Assert.IsAssignableFrom(t, s);
7.IsFalse()和IsTrue(),各3个重载,用来查看变量是是否为false或true,如果IsFalse()查看的变量的值是false则测试成功,如果是true则失败,IsTrue()与之相反。
8.IsNull()和IsNotNull(),各3个重载,用来查看对象是否为空和不为空。
9.IsEmpty()和IsNotEmpty(),各6个重载,用来判断字符串或集合是否为空串或没有元素,其中集合类型应与ICollection兼容。
10.IsNaN(),3个重载,用来判断指定的值是否不是数字。
11.Fail(),3个重载,意为失败,用来抛出错误。我个人认为有两个用途:首先是在测试驱动开发中,由于测试用例都是在被测试的类之前编写,而写成时又不清楚其正确与否,此时可以使用Fail方法抛出错误进行模拟;其次是抛出意外的错误,比如要测试的内容是从数据库中读取的数据是否正确,而导致错误的原因却是数据库连接失败。
12.Ignore(),3个重载,意为忽略,用来忽略后续代码的执行,用途可以参考Fail()方法。
此外,NUnit还提供了一个专用于字符串的静态类NUnit.Framework.StringAssert,该类主要包含4个方法:
1.Contains(),3个重载,用来查看指定的第二个字符串中是否包含了第一个字符串。
2.StartsWith ()和EndsWith (),各3个重载,分别用来查看指定的第一个字符串是否位于第二个字符串的开头和结尾。
3.AreEqualIgnoringCase(),3个重载,用来比较两个字符串是否相等。
五、运行NUnit
下面请先点击菜单“调试”->“启动调试”或按F5键运行程序。等等,main函数里头好象一句代码也没写过呢吧?没错,一句也没写,不过你照做可以了。在看到黑屏一闪之后,程序生成完毕。
程序生成后,可以使用NUnit进行测试了。NUnit有两种界面,一种是命令行的,一种是可视化的,这里使用的是后者。点击“开始”菜单->“所有程序”->“NUnit-Net-2.0 2.2.10”->“NUnit-Net-2.0 2.2.10”,打开NUnit的可视化界面:
点击菜单“File”->“Open”,打开刚才运行生成的可执行文件:
此时可以使用BookTest类对Book类进行测试了。请首先选择testId,点击“Run”按钮,运行结果如下图: