| Tony Gong的技术Blog |
|
|||
| 技术旅途中蹒跚的行者 | ||||
|
公告
日历
统计
导航 |
本章主要讲解NUnit的几个Attribute(特性)的用法。
1,TestFixture Imports NUnit.Framework![]() <TestFixture()> _![]() Public Class Class1TestClass Class1Test![]() Public Sub New()Sub New()![]() End Sub end class这个类包含了测试代码,你需要给我看一下。然后NUnit就到这个类里面去看看是否有需要他出马的机会。 2,Test <Test()> _![]() Public Sub FindMaxTest()Sub FindMaxTest() '定义一个数组 Dim list1 As Int32() = {1, 3, 10, 4} Dim my As New Class1 '测试数组list1中的最大整数是不是10。 Assert.AreEqual(4, my.FindMax(list1)) End Sub这里的<Test()>(C#中为[Test]),这个特性告诉NUnit:
让我们接下去讲解其他Attribute: 3,TestFixtureSetup和TestFixtureTearDown TestFixtureSetup这个特性的作用是为整个测试类初始化一些资源,准备好测试环境,然后给该测试类的几个测试(Test)使用,而TestFixtureTearDown则是把TestFixtureSetup初始化的一些资源释放掉。 我们可以通过下面这个例子来更好的理解: Imports NUnit.Framework![]() <TestFixture()> _![]() Public Class Class1TestClass Class1Test Private con As Connection![]() <TestFixtureSetUp()> _![]() Public Sub MyFixtureSetUp()Sub MyFixtureSetUp() '打开数据库联接 conn = New Connection("sqlXXX", user, password) conn.open() End Sub![]() <TestFixtureTearDown()> _![]() Public Sub MyFixtureTearDown()Sub MyFixtureTearDown() '关闭数据库联接 conn.close() End Sub![]() ![]() <Test()> _![]() Public Sub Mytest1()Sub Mytest1() '使用conn作某些测试 End Sub![]() <Test()> _![]() Public Sub Mytest2()Sub Mytest2() '使用conn作某些测试 End Sub![]() End Class当你用NUnit测试Mytest1,Mytest2这2个test时,程序的运行顺序是这样的: MyFixtureSetUp(初始化测试环境) Mytest1(test1) Mytest2(test2) TestFixtureTearDown(释放资源) 4,Setup和TearDown 这2个特性和TestFixtureSetup,TestFixtureTearDown有点类似,区别在于: Setup将在每个test之前运行,TearDown将在每个test之后运行。简单的说TestFixtureSetup,TestFixtureTearDown在一个测试类中之会运行一次;而Setup和TearDown,这个测试类有几个test被测试,就将运行几次。 举例说明: Imports NUnit.Framework![]() <TestFixture()> _![]() Public Class Class1TestClass Class1Test Private con As Connection![]() <SetUp()> _![]() Public Sub MyFixtureSetUp()Sub MyFixtureSetUp() '打开数据库联接 conn = New Connection("sqlXXX", user, password) conn.open() End Sub![]() <TearDown()> _![]() Public Sub MyFixtureTearDown()Sub MyFixtureTearDown() '关闭数据库联接 conn.close() End Sub![]() ![]() <Test()> _![]() Public Sub Mytest1()Sub Mytest1() '使用conn作某些测试 End Sub![]() <Test()> _![]() Public Sub Mytest2()Sub Mytest2() '使用conn作某些测试 End Sub![]() End Class当你用NUnit测试Mytest1,Mytest2这2个test时,程序的运行顺序是这样的: SetUp(初始化测试环境) Mytest1(test1) TearDown(释放资源) SetUp(初始化测试环境) Mytest2(test2) TearDown(释放资源) 可以看出,每个test前后都运行了SetUp和TearDown 对3和4这2组特性的选择,我个人在实际使用中感觉差别不大,随便用哪种都行,2种都用也无不可。我一般是用TestFixtureSetup和TestFixtureTearDown,一次性把资源都设置好,然后再一次性释放,写起来方便 5,Ignore 临时忽略一些test。 在以下情况可能会用到: (1),你的测试用例写好了,但实际代码却还没完成,这样的话测试肯定是不能通过的,但是你又不想看到NUnit抛出一个红灯笼,你就可以暂时用Ignore忽略掉这个test。NUnit会抛出一个黄灯,提醒你这个测试被忽略了。(不过,抛出个红灯笼也有好处的,它能鞭策你快点写好代码,哈哈) (2),有些测试可能耗费非常长的时间(比如几个小时),你展示不想测试它们,而想等半夜再测试,你就可以暂时Ignore它们。(不过,推荐用Category特性来把这些长时间测试分类出来,而不是用Ignore,这个将在后面讲到) 实例说明: <Test(), Ignore("Not Ready")> _![]() Public Sub FindMaxTest()Sub FindMaxTest() '定义一个数组 Dim list1 As Int32() = {1, 3, 10, 4} Dim my As New Class1 '测试数组list1中的最大整数是不是10。 Assert.AreEqual(10, my.FindMax(list1)) End Sub(C#中为[Test,Ignore("XXX")] )
6,ExpectedException <Test()> _![]() Public Sub FindMaxTest()Sub FindMaxTest()Sub FindMaxTest()Sub FindMaxTest() '定义一个数组 Dim list1() As Int32 = {1, 3, 10, 4} Dim list2() As Int32 = {1, 3, 4, 10} Dim list3() As Int32 = {10, 3, 1, 4} Dim list4() As Int32 = {-2, -1, -3} Dim my As New Class1 '测试数组list1中的最大整数是不是10。 Assert.AreEqual(10, my.FindMax(list1))![]() '测试边界值 Assert.AreEqual(10, my.FindMax(list2)) Assert.AreEqual(10, my.FindMax(list3))![]() '测试负数数组,数组中最大值应该是-1 Assert.AreEqual(-1, my.FindMax(list4)) End Sub![]() <Test(), ExpectedException(GetType(NullReferenceException))> _![]() Public Sub TestForException()Sub TestForException() Dim list1() As Int32 Dim my As New Class1 my.FindMax(list1) End Sub![]() ![]() 运行NUnit,如下: 果然如此,程序的确抛出了NullReferenceException。而假如系统没有如我们所料抛出异常,或者抛出的不是此类异常,NUnit则会给我们个红灯笼。 7,Category 分类。 该特性可以把一些测试分成不同的种类,比如我们前面提到的,假如有些测试很耗时,我们就可以把它们分类成LongTime测试,而把其他的测试分类成ShortTime测试,然后,我们可以在NUnit中选择只运行ShortTime的测试,那些LongTime的测试则可以在夜晚自动构建的时候运行它们。 使用举例如下: Imports NUnit.Framework![]() <TestFixture()> _![]() Public Class Class1TestClass Class1Test![]() <Test(), Category("ShortTime")> _![]() Public Sub Mytest1()Sub Mytest1()![]() End Sub![]() <Test(), Category("ShortTime")> _![]() Public Sub Mytest2()Sub Mytest2()![]() End Sub![]() <Test(), Category("LongTime")> _![]() Public Sub Mytest3()Sub Mytest3()![]() End Sub![]() <Test(), Category("LongTime")> _![]() Public Sub Mytest4()Sub Mytest4()![]() End Sub End Class(C#中为[Test][Category(“ShortTime”)] ) 程序员问答社区,解决您的IT难题
|
![]() |
|
| Copyright © Tony.Gong | Powered by: 博客园 模板提供:沪江博客 |