NUnit学习笔记4--单元测试和项目结合的几种方法
2007-02-28 10:22
681 查看
NUnit学习笔记4--单元测试和项目结合的几种方法
单元测试要运用到实际项目中去,必须把单元测试代码和项目通过某种途径联系在一起。
比如,在我的学习笔记1中,有一个工程:WindowsApplication12,这个工程中有Class1这个类,该类就是项目的实际代码,随后我在该工程中添加一个Class1Test的测试类,用来测试Class1中的一些方法。
这个过程,就是一种结合方法:对每个需要测试的类,都在该类的工程下建立一个测试类。
在我的实际经验中,接触到如下几种方法,以下进行举例说明,每种方法都有其特定使用环境,优缺点,供大家参考:
1,单元测试代码,直接写在需要被测试的类中。
solution结构如下:
代码如下:
Imports NUnit.Framework
<TestFixture()> _
Public Class Class1Class Class1
''' -----------------------------------------------------------------------------
''' <summary>
''' 查找最大值
''' </summary>
''' <param name="list">传入整数数组</param>
''' <returns>返回数组中的最大值</returns>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
Function FindMax()Function FindMax(ByVal list As Int32()) As Int32
Dim i As Int32
Dim max As Int32 = Int32.MinValue
For i = 0 To list.Length - 1
If list(i) > max Then
max = list(i)
End If
Next
Return max
End Function
''' -----------------------------------------------------------------------------
''' <summary>
''' 测试Class1类的FindMax方法
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
<Test()> _
Public 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
End Class
运行Nunit,结果如下:
这种方法的优点很明显:由于测试代码同被测试的方法放在一个类中,所以private等方法很容易被测试。但同时缺点也很明显,该类会被写得很复杂,估计很少会有人喜欢看这种代码,而且万一客户不需要这些代码的话,在最后部署的时候,关del测试代码,估计也是个大问题。
2,每写一个需要被测试的类,就写当前工程下新建一个相应的测试类,名字可以在被测试类后面加上Test以示区别。
solution结构如下:
代码就不写了,大致就是我在笔记1,2中举的例子。
这种方法的优点是结构比较清晰,在比较小的工程中使用还算不错,修改测试代码也比较方法。缺点同样是部署时删除单元测试代码比较麻烦,同时solution太大,有很多project时,有很大局限性。
3,solution有很多个工程时,专门新增加一些工程,用于写单元测试,比如有一个ClassLibrary3工程,则建一个TestForClassLibrary3工程,单元测试类放到这个工程中去。
solution结构如下:
注意,测试工程要引用被测试工程。
代码如下:
Public Class Class1Class Class1
''' -----------------------------------------------------------------------------
''' <summary>
''' 查找最大值
''' </summary>
''' <param name="list">传入整数数组</param>
''' <returns>返回数组中的最大值</returns>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
Function FindMax()Function FindMax(ByVal list As Int32()) As Int32
Dim i As Int32
Dim max As Int32 = Int32.MinValue
For i = 0 To list.Length - 1
If list(i) > max Then
max = list(i)
End If
Next
Return max
End Function
End Class
Imports NUnit.Framework
Imports ClassLibrary3
<TestFixture()> _
Public Class Class1TestClass Class1Test
Public Sub New()Sub New()
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' 测试Class1类的FindMax方法
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
<Test()> _
Public 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
End Class
由于是以工程为单位,所以部署起来很容易,只要把这几个工程去掉就可以了,将来再要用,也只要加上就可以了。不过操作相对来说比较繁琐,没有前2种方法便捷。
4,以上3种方法都需要在项目的solution中增加东西,但如果你的项目不允许你增加任何测试类或工程(虽然感觉很愚蠢,但的确很多公司不允许程序员这么做),或者你根本没有权限增加工程或文件,这3种方法将都不能使用,这时可以用第4种方法。
比如你想测试ClassLibrary3工程下的Class1类,你可以先build你的项目,生成ClassLibrary3工程的dll文件,然后在你本地建一个测试工程,引用这个dll,就可以不需要修改你的项目了。
测试solution结构如下(这个solution是在你电脑本地的,与你的项目没有关系):
测试代码如下:
Imports NUnit.Framework
<TestFixture()> _
Public Class Class1TestClass Class1Test
Public Sub New()Sub New()
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' 测试Class1类的FindMax方法
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
<Test()> _
Public 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
End Class
这种方法的最大优点是不需要修改你的项目,不过缺点也很多,不够灵活,操作复杂等。
我个人比较多用2,3,在很小的模块中有时会用1,不过比起用1来,可能使用TestDriven.NET更加方便些,这个我打算后面单独写篇文章。
以上是我平时的一些经验,可能有很大不足,希望指正。
posted on 2006-05-25 16:04 Tony.Gong 阅读(756) 评论(5) 编辑 收藏 引用 网摘 所属分类: 单元测试
//Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]>
评论:
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 LIVE Posted @ 2006-05-25 17:27
我觉得把测试写在被测试类里似乎不妥.虽然说可以,但是从类的设计角度来说,这样会然一个类变得非常杂,,不干净.从使用者的角度说,如果你调用这个类,这些测试的方法对于用户来说可见,,其实这些方法对于用户来说没有什么用途,可能你试图将测试方法变为private或什么的,但是你的单元测试就不可以用了.
我在写程序的时候,,我一般是先写测试,,然后写代码.
以上是我的理解.
欢迎一起讨论. 回复 更多评论
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 Tony.Gong Posted @ 2006-05-25 21:36
@LIVE
是啊,方法1仅仅是一个可行的方法,不过不推荐使用,似乎唯一的好处是可以很方便的测试private等方法。
TDD是最高目标,不过惯性的思维一下子还改变不了,没写代码就先写测试,一直不太习惯,可能是没有实际在项目中实践过,仅仅是平时自己写写。希望今后能在项目中不断实践TDD 回复 更多评论
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 黑马 Posted @ 2006-06-23 13:54
写的不错,通俗易懂,我有一点儿不明白,就是微软为不什么不把它集成到VS里面呢? 回复 更多评论
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 Tony.Gong Posted @ 2006-06-26 16:02
@黑马
vs2005里已经集成了
使用方法和nunit差不多 回复 更多评论
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 coolsun Posted @ 2006-08-30 21:36
TDD我也不适应!!估计就是习惯问题!但是我领导说坏习惯就要改! 回复 更多评论
单元测试要运用到实际项目中去,必须把单元测试代码和项目通过某种途径联系在一起。
比如,在我的学习笔记1中,有一个工程:WindowsApplication12,这个工程中有Class1这个类,该类就是项目的实际代码,随后我在该工程中添加一个Class1Test的测试类,用来测试Class1中的一些方法。
这个过程,就是一种结合方法:对每个需要测试的类,都在该类的工程下建立一个测试类。
在我的实际经验中,接触到如下几种方法,以下进行举例说明,每种方法都有其特定使用环境,优缺点,供大家参考:
1,单元测试代码,直接写在需要被测试的类中。
solution结构如下:
代码如下:
Imports NUnit.Framework
<TestFixture()> _
Public Class Class1Class Class1
''' -----------------------------------------------------------------------------
''' <summary>
''' 查找最大值
''' </summary>
''' <param name="list">传入整数数组</param>
''' <returns>返回数组中的最大值</returns>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
Function FindMax()Function FindMax(ByVal list As Int32()) As Int32
Dim i As Int32
Dim max As Int32 = Int32.MinValue
For i = 0 To list.Length - 1
If list(i) > max Then
max = list(i)
End If
Next
Return max
End Function
''' -----------------------------------------------------------------------------
''' <summary>
''' 测试Class1类的FindMax方法
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
<Test()> _
Public 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
End Class
运行Nunit,结果如下:
这种方法的优点很明显:由于测试代码同被测试的方法放在一个类中,所以private等方法很容易被测试。但同时缺点也很明显,该类会被写得很复杂,估计很少会有人喜欢看这种代码,而且万一客户不需要这些代码的话,在最后部署的时候,关del测试代码,估计也是个大问题。
2,每写一个需要被测试的类,就写当前工程下新建一个相应的测试类,名字可以在被测试类后面加上Test以示区别。
solution结构如下:
代码就不写了,大致就是我在笔记1,2中举的例子。
这种方法的优点是结构比较清晰,在比较小的工程中使用还算不错,修改测试代码也比较方法。缺点同样是部署时删除单元测试代码比较麻烦,同时solution太大,有很多project时,有很大局限性。
3,solution有很多个工程时,专门新增加一些工程,用于写单元测试,比如有一个ClassLibrary3工程,则建一个TestForClassLibrary3工程,单元测试类放到这个工程中去。
solution结构如下:
注意,测试工程要引用被测试工程。
代码如下:
Public Class Class1Class Class1
''' -----------------------------------------------------------------------------
''' <summary>
''' 查找最大值
''' </summary>
''' <param name="list">传入整数数组</param>
''' <returns>返回数组中的最大值</returns>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
Function FindMax()Function FindMax(ByVal list As Int32()) As Int32
Dim i As Int32
Dim max As Int32 = Int32.MinValue
For i = 0 To list.Length - 1
If list(i) > max Then
max = list(i)
End If
Next
Return max
End Function
End Class
Imports NUnit.Framework
Imports ClassLibrary3
<TestFixture()> _
Public Class Class1TestClass Class1Test
Public Sub New()Sub New()
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' 测试Class1类的FindMax方法
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
<Test()> _
Public 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
End Class
由于是以工程为单位,所以部署起来很容易,只要把这几个工程去掉就可以了,将来再要用,也只要加上就可以了。不过操作相对来说比较繁琐,没有前2种方法便捷。
4,以上3种方法都需要在项目的solution中增加东西,但如果你的项目不允许你增加任何测试类或工程(虽然感觉很愚蠢,但的确很多公司不允许程序员这么做),或者你根本没有权限增加工程或文件,这3种方法将都不能使用,这时可以用第4种方法。
比如你想测试ClassLibrary3工程下的Class1类,你可以先build你的项目,生成ClassLibrary3工程的dll文件,然后在你本地建一个测试工程,引用这个dll,就可以不需要修改你的项目了。
测试solution结构如下(这个solution是在你电脑本地的,与你的项目没有关系):
测试代码如下:
Imports NUnit.Framework
<TestFixture()> _
Public Class Class1TestClass Class1Test
Public Sub New()Sub New()
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' 测试Class1类的FindMax方法
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [TonyGong] 5/25/2006 Created
''' </history>
''' -----------------------------------------------------------------------------
<Test()> _
Public 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
End Class
这种方法的最大优点是不需要修改你的项目,不过缺点也很多,不够灵活,操作复杂等。
我个人比较多用2,3,在很小的模块中有时会用1,不过比起用1来,可能使用TestDriven.NET更加方便些,这个我打算后面单独写篇文章。
以上是我平时的一些经验,可能有很大不足,希望指正。
posted on 2006-05-25 16:04 Tony.Gong 阅读(756) 评论(5) 编辑 收藏 引用 网摘 所属分类: 单元测试
//Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]>
评论:
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 LIVE Posted @ 2006-05-25 17:27
我觉得把测试写在被测试类里似乎不妥.虽然说可以,但是从类的设计角度来说,这样会然一个类变得非常杂,,不干净.从使用者的角度说,如果你调用这个类,这些测试的方法对于用户来说可见,,其实这些方法对于用户来说没有什么用途,可能你试图将测试方法变为private或什么的,但是你的单元测试就不可以用了.
我在写程序的时候,,我一般是先写测试,,然后写代码.
以上是我的理解.
欢迎一起讨论. 回复 更多评论
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 Tony.Gong Posted @ 2006-05-25 21:36
@LIVE
是啊,方法1仅仅是一个可行的方法,不过不推荐使用,似乎唯一的好处是可以很方便的测试private等方法。
TDD是最高目标,不过惯性的思维一下子还改变不了,没写代码就先写测试,一直不太习惯,可能是没有实际在项目中实践过,仅仅是平时自己写写。希望今后能在项目中不断实践TDD 回复 更多评论
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 黑马 Posted @ 2006-06-23 13:54
写的不错,通俗易懂,我有一点儿不明白,就是微软为不什么不把它集成到VS里面呢? 回复 更多评论
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 Tony.Gong Posted @ 2006-06-26 16:02
@黑马
vs2005里已经集成了
使用方法和nunit差不多 回复 更多评论
# re: NUnit学习笔记4--单元测试和项目结合的几种方法 coolsun Posted @ 2006-08-30 21:36
TDD我也不适应!!估计就是习惯问题!但是我领导说坏习惯就要改! 回复 更多评论
相关文章推荐
- NUnit学习笔记4--单元测试和项目结合的几种方法
- NUnit学习笔记4--单元测试和项目结合的几种方法
- NUnit学习笔记4--单元测试和项目结合的几种方法
- NUnit学习笔记4--单元测试和项目结合的几种方法(摘录)
- Nunit--测试和项目结合的几种方法
- 安卓学习笔记之Handler更新UI的几种方法及对比
- iOS学习笔记2(结合项目)--Category和Extension的区别
- node.js学习笔记(3)-node.js结合mysql数据库实现的web项目中常见功能--登录验证、session传值、拦截器、ajax传值等
- Spring2.5.6学习笔记-实例化bean的几种方法
- APIDemo学习笔记——Android上几种简单的Animation使用方法(三)——3D Transition
- APIDemo学习笔记——Android上几种简单的Animation使用方法(二)
- java学习笔记-Java实现几种常见排序方法
- 网络爬虫学习笔记——GET方法下几种常用情况
- CSS学习笔记-导入CSS的几种方法(三)
- cocos2d-x学习笔记(二)序列帧动画实现的几种方法
- 学习笔记:几种注入方法
- cocos2d-x-3.1 vs 输出Log的几种方法 (coco2d-x 学习笔记三)
- APIDemo学习笔记——Android上几种简单的Animation使用方法(一)
- python提高计算速度的几种方法---学习笔记26
- Opencv学习笔记(二十)--读取视频帧的几种方法