NUnit学习笔记4--单元测试和项目结合的几种方法

原创 2006年05月26日 10:27:00
单元测试要运用到实际项目中去,必须把单元测试代码和项目通过某种途径联系在一起。
比如,在我的学习笔记1中,有一个工程:WindowsApplication12,这个工程中有Class1这个类,该类就是项目的实际代码,随后我在该工程中添加一个Class1Test的测试类,用来测试Class1中的一些方法。
这个过程,就是一种结合方法:对每个需要测试的类,都在该类的工程下建立一个测试类。

在我的实际经验中,接触到如下几种方法,以下进行举例说明,每种方法都有其特定使用环境,优缺点,供大家参考:
1,单元测试代码,直接写在需要被测试的类中。
solution结构如下:


代码如下:
Imports NUnit.Framework

<TestFixture()> _
Public Class Class1

    
''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' 查找最大值
    ''' </summary>
    ''' <param name="list">传入整数数组</param>
    ''' <returns>返回数组中的最大值</returns>
    ''' <remarks>
    ''' </remarks>
    ''' <history>
    '''     [TonyGong]    5/25/2006    Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    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()
        
'
        Dim list1() As Int32 = {13104}
        
Dim list2() As Int32 = {13410}
        
Dim list3() As Int32 = {10314}
        
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 Class1
    
''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' 查找最大值
    ''' </summary>
    ''' <param name="list">传入整数数组</param>
    ''' <returns>返回数组中的最大值</returns>
    ''' <remarks>
    ''' </remarks>
    ''' <history>
    '''     [TonyGong]    5/25/2006    Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    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 Class1Test
    
Public Sub New()

    
End Sub


    
''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' 测试Class1类的FindMax方法
    ''' </summary>
    ''' <remarks>
    ''' </remarks>
    ''' <history>
    '''     [TonyGong]    5/25/2006    Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    <Test()> _
    
Public Sub FindMaxTest()
        
'
        Dim list1() As Int32 = {13104}
        
Dim list2() As Int32 = {13410}
        
Dim list3() As Int32 = {10314}
        
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 Class1Test
    
Public Sub New()

    
End Sub


    
''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' 测试Class1类的FindMax方法
    ''' </summary>
    ''' <remarks>
    ''' </remarks>
    ''' <history>
    '''     [TonyGong]    5/25/2006    Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    <Test()> _
    
Public Sub FindMaxTest()
        
'
        Dim list1() As Int32 = {13104}
        
Dim list2() As Int32 = {13410}
        
Dim list3() As Int32 = {10314}
        
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更加方便些,这个我打算后面单独写篇文章。

以上是我平时的一些经验,可能有很大不足,希望指正。

NUnit学习笔记4--单元测试和项目结合的几种方法

单元测试要运用到实际项目中去,必须把单元测试代码和项目通过某种途径联系在一起。比如,在我的学习笔记1中,有一个工程:WindowsApplication12,这个工程中有Class1这个类,该类就是项...
  • killer000777
  • killer000777
  • 2008年01月16日 12:10
  • 649

NUnit学习笔记4--单元测试和项目结合的几种方法

NUnit学习笔记4--单元测试和项目结合的几种方法 单元测试要运用到实际项目中去,必须把单元测试代码和项目通过某种途径联系在一起。比如,在我的学习笔记1中,有一个工程:WindowsApplicat...
  • qudymeteor
  • qudymeteor
  • 2007年02月28日 10:22
  • 546

VS2013下单元进行单元测试的简单方法

打开vs2013下的“扩展和更新”里搜索"Unit Test Generator"安装更新插件 在我们编写的代码方法体内右键菜单选择“Generate Unit Test” 就可以选择 注...
  • qbook
  • qbook
  • 2015年02月11日 09:27
  • 7256

NUnit学习笔记4--单元测试和项目结合的几种方法(摘录)

单元测试要运用到实际项目中去,必须把单元测试代码和项目通过某种途径联系在一起。比如,在我的学习笔记1中,有一个工程:WindowsApplication12,这个工程中有Class1这个类,该类就是项...
  • zhbi028
  • zhbi028
  • 2007年09月18日 17:49
  • 234

如何使用Nunit3在VS2017中进行.NET Core和.NET Standard项目单元测试

VSIX(Visual Studio扩展)当前还不支持.NET Core和.NET Standard项目的单元测试,所以需要在项目中使用NuGet安装支持nunit测试的扩展包。 打开VS2017...
  • loongsking
  • loongsking
  • 2017年11月14日 12:25
  • 432

vs2013添加单元测试

vs2013添加单元测试 要运行 vs2013单元测试 ,那么打开VS2013选择 工具 (菜单) -扩展和更新,搜索并安装Unit Test Generator,如下图。     Install U...
  • huwei2003
  • huwei2003
  • 2016年05月21日 11:24
  • 2610

NUnit单元测试

单元测试对程序员来说是非常重要的一门技术,但是在实际编程中却往往被程序员所忽视。微软的VS开发工具为我们提供了强大的单元测试环境,在VS当中可以直接对类库项目进行测试,极大的方便了程序员的自我纠错能力...
  • guwei4037
  • guwei4037
  • 2014年02月16日 00:38
  • 3859

使用Nunit做单元测试

参加完自考、软考,对单元测试都是概念上的理解,这篇博文主要是从实践上,讲解一下单元测试如何实现,使用什么工具,以及简单的实例讲解。     一、单元测试     单元测试,是开发者编写的一小段...
  • zjx86320
  • zjx86320
  • 2015年02月28日 15:42
  • 1426

NUnit.Framework在VS2015中如何进行单元测试

微软在VS2015中加入了自动化生成测试功能, 在需要测试的源文件的公共方法中右键既可以创建单元测试。 不过需要注意的是,要在公共方法中创建,否则会提示这个错误 如下是自动化单元测试界面,可以...
  • loongsking
  • loongsking
  • 2017年01月16日 11:55
  • 3034

利用Selenium搭建Nunit测试框架

1、首先下载selenium RC和selenium sever,并将selenium sever放在selenium RC的解压缩目录下,创建文件start up.bat文件,里面写上java -j...
  • wangyong0921
  • wangyong0921
  • 2013年08月28日 15:31
  • 1320
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NUnit学习笔记4--单元测试和项目结合的几种方法
举报原因:
原因补充:

(最多只允许输入30个字)