下面简单介绍一下上边用到的静态类NUnit.Framework.Assert。该类主要包含20个方法:
1.AreEqual()和AreNotEqual()方法,用来查看两个对象的值是否相等或不等,与对象比较中使用的Equals()方法类似。
2.AreSame()和AreNotSame()方法,用来比较两个对象的引用是否相等或不等,类似于通过“Is”或“==”比较两个对象。
3.Contains()方法,用来查看对象是否在集合中,集合类型应与System.Collections.IList兼容。示例:
Dim o As New Object Dim al As New ArrayList al.Add(o) Assert.Contains(o, al)
4.Greater()和Less()方法,用来比较两个数值的大小,前者相当于大于号(>),后者相当于小于号(<)。
5.IsInstanceOfType()和IsNotInstanceOfType()方法,用来判断对象是否兼容于指定类型。示例:
Dim t As Type = New Object().GetType Dim s As String = "" Assert.IsInstanceOfType(t, s)
由于Object是.net中所有类型的基类,String类型兼容于Object,因此这个示例是能够运行通过的。而下边这个示例运行将是失败的:
Dim t As Type = New ArrayList().GetType Dim s As String = "" Assert.IsInstanceOfType(t, s)
6.IsAssignableFrom()和IsNotAssignableFrom()方法,用来判断对象是否是指定类型的实例。示例:
Dim t As Type = New Object().GetType Dim s As String = "" Assert.IsAssignableFrom(t, s)
这个示例与之前的示例是一样的,但由于字符串s不是Object类型的,因此无法运行通过。而下边这个实例可以运行通过:
Dim t As Type = New String("").GetType Dim s As String = "" Assert.IsAssignableFrom(t, s)
7.IsFalse()和IsTrue()方法,用来查看变量是是否为false或true,如果IsFalse()查看的变量的值是false则测试成功,如果是true则失败,IsTrue()与之相反。
8.IsNull()和IsNotNull()方法,用来查看对象是否为空和不为空。
9.IsEmpty()和IsNotEmpty()方法,用来判断字符串或集合是否为空串或没有元素,其中集合类型应与ICollection兼容。
10.IsNaN()方法,用来判断指定的值是否不是数字。
11.Fail()方法,意为失败,用来抛出错误。我个人认为有两个用途:首先是在测试驱动开发中,由于测试用例都是在被测试的类之前编写,而写成时又不清楚其正确与否,此时就可以使用Fail方法抛出错误进行模拟;其次是抛出意外的错误,比如要测试的内容是从数据库中读取的数据是否正确,而导致错误的原因却是数据库连接失败。
12.Ignore()方法,意为忽略,用来忽略后续代码的执行,用途可以参考Fail()方法。
此外,NUnit还提供了一个专用于字符串的静态类NUnit.Framework. StringAssert,该类主要包含4个方法:
1.Contains()方法,用来查看指定的第二个字符串中是否包含了第一个字符串。
2.StartsWith ()和EndsWith ()方法,分别用来查看指定的第一个字符串是否位于第二个字符串的开头和结尾。
3.AreEqualIgnoringCase()方法,用来比较两个字符串是否相等。
下面再看一下C#代码:
using System;using System.Collections.Generic;using System.Text;using NUnit.Framework;namespace NUnitCS{[TestFixture]public class BookTest{Book book = null;[SetUp]public void Init(){Console.WriteLine("测试开始!");book = new Book();Console.WriteLine("book对象被初始化!");}[Test]public void testId(){book.id = "001"; //设置id属性的值为//使用Assert查看id属性的值是否为Assert.AreEqual("001", book.id);Console.WriteLine("id属性被测试!");}[Test]public void testName(){book.name = "ASP"; //设置name属性的值为ASP//使用Assert查看name属性的值是否为JSP,这是个必然出现错误的测试Assert.AreEqual("JSP", book.name);Console.WriteLine("name属性被测试!");}[TearDown]public void Dispose(){Console.WriteLine("book对象将被清理!");book = null;Console.WriteLine("测试结束!");}}}
没什么好说的吧?下面看J#代码:
package NUnitJS;import System.*;import NUnit.Framework.*;/** @attribute TestFixture() */public class BookTest{Book book = null;/** @attribute SetUp() */public void Init(){Console.WriteLine("测试开始!");book = new Book();Console.WriteLine("book对象被初始化!");}/** @attribute Test() */public void testId() {book.set_id("001"); //设置id属性的值为001//使用Assert查看id属性的值是否为001Assert.AreEqual("001", book.get_id());Console.WriteLine("id属性被测试!");}/** @attribute Test() */public void testName() {book.set_id("ASP"); //设置name属性的值为ASP//使用Assert查看name属性的值是否为JSP,这是个必然出现错误的测试Assert.AreEqual("JSP", book.get_name());Console.WriteLine("name属性被测试!");}/** @attribute TearDown() */public void Dispose(){Console.WriteLine("book对象将被清理!");book = null;Console.WriteLine("测试结束!");}}
改好后,点击菜单“调试”->“启动调试”或按F5键运行程序。等等,main函数里头好象一句代码也没写过呢吧?没错,一句也没写,不过你照做就可以了。在看到黑屏一闪之后,编码工作完成。
五、运行NUnit
编码完成后,就可以使用NUnit测试了。NUnit有两种界面,一种是命令行的,一种是可视化的,我使用的就是后者。点击“开始”菜单->“所有程序”->“NUnit-Net-2.0 2.2.6”->“NUnit-Gui”,打开NUnit的可视化界面:
点击菜单“File”->“Open”,打开刚才运行生成的可执行文件:
此时就可以使用BookTest类对Book类进行测试了。请首先选择testId,点击“Run”按钮,运行结果如下图:
testId前的灰点变绿,而且进度条显示为绿条,这表明运行成功。下面再选择BookTest,点击“Run”按钮,运行结果如下图:
testId前的点依然是绿色,但testName前的点是红色,而且进度条显示为红条,这表明testName中存在错误。不过这个错误是预计之内的,如果不想看到,可以在vs中将testName()方法中的”JSP”改成”ASP”,然后重新运行。此时无须重新启动NUnit,NUnit会自动加载重新编写好的文件。此时再运行BookTest,进度条已不是红色,而是绿色了。
六、说明
本文是对《NUnit学习笔记》的修正,NUnit和Visual Studio.net都使用了新版本。NUnit 2.2.6对2.2.0进行了很多扩展,这从对NUnit.Framework.Assert和NUnit.Framework.StringAssert的介绍就可以看出来。
此外,这里只是对NUnit进行了简单的介绍,NUnit还提供了更多的功能,相关内容可以参考其文档。不过是英文的哦!