`

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

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

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


代码如下:
ImportsNUnit.Framework

<TestFixture()>_
PublicClassClass1ClassClass1

'''-----------------------------------------------------------------------------
'''<summary>
'''查找最大值
'''</summary>
'''<paramname="list">传入整数数组</param>
'''<returns>返回数组中的最大值</returns>
'''<remarks>
'''</remarks>
'''<history>
'''[TonyGong]5/25/2006Created
'''</history>
'''-----------------------------------------------------------------------------
FunctionFindMax()FunctionFindMax(ByVallistAsInt32())AsInt32
DimiAsInt32
DimmaxAsInt32=Int32.MinValue

Fori=0Tolist.Length-1
Iflist(i)>maxThen
max
=list(i)
EndIf
Next

Returnmax

EndFunction



'''-----------------------------------------------------------------------------
'''<summary>
'''测试Class1类的FindMax方法
'''</summary>
'''<remarks>
'''</remarks>
'''<history>
'''[TonyGong]5/25/2006Created
'''</history>
'''-----------------------------------------------------------------------------
<Test()>_
PublicSubFindMaxTest()SubFindMaxTest()
'
Dimlist1()AsInt32={1,3,10,4}
Dimlist2()AsInt32={1,3,4,10}
Dimlist3()AsInt32={10,3,1,4}
Dimlist4()AsInt32={-2,-1,-3}

DimmyAsNewClass1
'测试数组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))

EndSub



EndClass



运行Nunit,结果如下:


这种方法的优点很明显:由于测试代码同被测试的方法放在一个类中,所以private等方法很容易被测试。但同时缺点也很明显,该类会被写得很复杂,估计很少会有人喜欢看这种代码,而且万一客户不需要这些代码的话,在最后部署的时候,关del测试代码,估计也是个大问题。

2,每写一个需要被测试的类,就写当前工程下新建一个相应的测试类,名字可以在被测试类后面加上Test以示区别。
solution结构如下:


代码就不写了,大致就是我在笔记1,2中举的例子。

这种方法的优点是结构比较清晰,在比较小的工程中使用还算不错,修改测试代码也比较方法。缺点同样是部署时删除单元测试代码比较麻烦,同时solution太大,有很多project时,有很大局限性。

3,solution有很多个工程时,专门新增加一些工程,用于写单元测试,比如有一个ClassLibrary3工程,则建一个TestForClassLibrary3工程,单元测试类放到这个工程中去。
solution结构如下:

注意,测试工程要引用被测试工程。

代码如下:

PublicClassClass1ClassClass1
'''-----------------------------------------------------------------------------
'''<summary>
'''查找最大值
'''</summary>
'''<paramname="list">传入整数数组</param>
'''<returns>返回数组中的最大值</returns>
'''<remarks>
'''</remarks>
'''<history>
'''[TonyGong]5/25/2006Created
'''</history>
'''-----------------------------------------------------------------------------
FunctionFindMax()FunctionFindMax(ByVallistAsInt32())AsInt32
DimiAsInt32
DimmaxAsInt32=Int32.MinValue

Fori=0Tolist.Length-1
Iflist(i)>maxThen
max
=list(i)
EndIf
Next

Returnmax

EndFunction


EndClass


ImportsNUnit.Framework
ImportsClassLibrary3

<TestFixture()>_
PublicClassClass1TestClassClass1Test
PublicSubNew()SubNew()

EndSub


'''-----------------------------------------------------------------------------
'''<summary>
'''测试Class1类的FindMax方法
'''</summary>
'''<remarks>
'''</remarks>
'''<history>
'''[TonyGong]5/25/2006Created
'''</history>
'''-----------------------------------------------------------------------------
<Test()>_
PublicSubFindMaxTest()SubFindMaxTest()
'
Dimlist1()AsInt32={1,3,10,4}
Dimlist2()AsInt32={1,3,4,10}
Dimlist3()AsInt32={10,3,1,4}
Dimlist4()AsInt32={-2,-1,-3}

DimmyAsNewClass1
'测试数组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))

EndSub


EndClass


由于是以工程为单位,所以部署起来很容易,只要把这几个工程去掉就可以了,将来再要用,也只要加上就可以了。不过操作相对来说比较繁琐,没有前2种方法便捷。

4,以上3种方法都需要在项目的solution中增加东西,但如果你的项目不允许你增加任何测试类或工程(虽然感觉很愚蠢,但的确很多公司不允许程序员这么做),或者你根本没有权限增加工程或文件,这3种方法将都不能使用,这时可以用第4种方法。
比如你想测试ClassLibrary3工程下的Class1类,你可以先build你的项目,生成ClassLibrary3工程的dll文件,然后在你本地建一个测试工程,引用这个dll,就可以不需要修改你的项目了。
测试solution结构如下(这个solution是在你电脑本地的,与你的项目没有关系):


测试代码如下:

ImportsNUnit.Framework

<TestFixture()>_
PublicClassClass1TestClassClass1Test
PublicSubNew()SubNew()

EndSub


'''-----------------------------------------------------------------------------
'''<summary>
'''测试Class1类的FindMax方法
'''</summary>
'''<remarks>
'''</remarks>
'''<history>
'''[TonyGong]5/25/2006Created
'''</history>
'''-----------------------------------------------------------------------------
<Test()>_
PublicSubFindMaxTest()SubFindMaxTest()
'
Dimlist1()AsInt32={1,3,10,4}
Dimlist2()AsInt32={1,3,4,10}
Dimlist3()AsInt32={10,3,1,4}
Dimlist4()AsInt32={-2,-1,-3}

DimmyAsNewClass1
'测试数组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))

EndSub


EndClass



这种方法的最大优点是不需要修改你的项目,不过缺点也很多,不够灵活,操作复杂等。

我个人比较多用2,3,在很小的模块中有时会用1,不过比起用1来,可能使用TestDriven.NET更加方便些,这个我打算后面单独写篇文章。

以上是我平时的一些经验,可能有很大不足,希望指正。
posted on 2006-05-25 16:04 Tony.Gong 阅读(756) 评论(5) 编辑收藏 引用 网摘 所属分类: 单元测试

//

评论:
  • #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 代码测试讲解--软件测试

    在实际项目中,NUnit 可以与其他的工具和框架结合使用,如 Moq(模拟对象库)进行依赖注入的测试,或者使用 FluentAssertions 提供更优雅的断言方式。此外,持续集成服务器如 Jenkins 或 Azure DevOps 可以配置为...

    NUnit-2.4.1-net-2.0 单元检测工具

    4. **运行时控制**:NUnit提供了一种方式来控制测试的执行,如设置测试的执行顺序、过滤特定测试、并行执行测试等。此外,还可以使用`[Setup]`和`[TearDown]`方法在每个测试之前和之后执行初始化和清理工作。 5. **...

    单元测试工具NUnit-2.5

    对于VS2008的集成,NUnit 2.5通过安装MSI文件(如NUnit-2.5.0.8258.msi)可以方便地添加到Visual Studio的测试工具集中。这使得开发者可以直接在IDE内部运行NUnit测试,无需离开熟悉的开发环境。VS2008的集成还包括...

    Nunit-2.5 .net 单元测试工具

    2. **测试结构**:NUnit支持使用测试类和测试方法来定义测试。测试类包含多个测试方法,每个方法代表一个独立的测试用例。测试方法使用`[Test]`属性标识,并且应返回void,不接受参数。 3. **断言**:NUnit提供了一...

    NUnit-2.4.1-net-2.0

    4. **可扩展性**:NUnit支持扩展,可以通过编写自定义的测试适配器和约束来满足特定项目的需求。 5. **兼容性**:尽管NUnit 2.4.1是针对.NET 2.0设计的,但它的设计原则和API结构在后续版本中得到了延续,因此...

    Nunit-2.6.3单元测试库

    NUnit 提供了多种类型的测试方法,如 `[Test]` 属性标记的方法表示一个测试用例,`[SetUp]` 和 `[TearDown]` 用于在每个测试前后的初始化和清理操作,`[TestFixture]` 用于定义一组相关的测试。此外,还有用于断言的...

    NUnit-2.2.9-net-2.0-dbg 中文

    在软件开发过程中,单元测试是一种重要的实践,它帮助开发者隔离和验证代码中的各个小部分,以确保它们按预期工作。 NUnit的核心组件是`nunit.framework.dll`,这是一个动态链接库,包含了执行单元测试所需的所有...

    Nunit单元测试工具

    提到的"NUnit-2.6.4"是NUnit的一个旧版本,发布于2014年,这个版本引入了对.NET 4.0和4.5的支持,同时修复了一些已知问题。不过,随着.NET技术的发展,建议开发者使用更新的版本,如NUnit 3.x,它提供了更多的特性,...

    Nunit单元测试报告

    下面将详细解释如何使用NUnit进行单元测试,以"HelloWorld"项目为例。 1. **创建项目和类**: 首先,创建一个简单的控制台应用程序,如"HelloWorld"。在这个项目中,我们定义一个名为`Myclass`的类,包含两个方法`...

    单元测试之道C#版——使用NUnit(中文版)

    《单元测试之道C#版——使用NUnit》是一本深入探讨C#环境下单元测试实践的著作,荣获第14届震撼大奖(Jolt Award)和生产力大奖(Productivity Award),充分体现了其在软件开发领域的影响力和实用性。本书的核心是...

    NUnit单元测试_c#版pdf

    这个“NUnit单元测试_c#版pdf”似乎是一个扫描版的教程,对于学习如何在C#项目中实施单元测试非常有帮助。 单元测试是一种软件开发实践,它允许程序员对代码中的最小可测试单元进行验证,通常是一个函数或方法。...

    单元测试—NUnit测试

    微软的VS开发工具为我们提供了强大的单元测试环境,在VS当中可以直接对类库项目进行测试,极大的方便了程序员的自我纠错能力。除了官方的解决方案之外,还有一种非常好的免费开源的第三方测试工具,那就是NUnit。它...

    winform 使用NUNIT进行单元测试源码

    本资源“winform 使用NUNIT进行单元测试源码”提供了一种将NUnit集成到WinForm项目中进行单元测试的方法。以下是对这个主题的详细说明: 1. **NUnit框架**:NUnit是一个功能强大的测试框架,支持.NET Framework、...

    NUnit单元测试实例

    NUnit是一个广泛使用的开源单元测试框架,主要用于.NET应用程序的测试。在C#编程环境中,NUnit为开发者提供了方便、灵活的测试工具,确保代码的质量和稳定性。本实例将深入探讨如何利用NUnit进行单元测试,以及它的...

    .NET单元测试工具NUnit

    单元测试是一种编程实践,它允许开发者针对软件的最小可测试单元,即函数、方法或类,进行独立验证。通过这种方式,开发者可以尽早发现潜在的错误和缺陷,提高代码的稳定性和维护性。 NUnit不仅支持.NET Framework...

    NUnit-2.6.0.12051-src 著名的单元测试工具源代码

    总的来说,NUnit-2.6.0.12051-src是.NET开发者的重要资源,无论是为了学习单元测试的最佳实践,还是为了改进和定制测试框架,都能从中受益。通过阅读和分析源代码,开发者可以提升自己的编程技能,并为自己的项目...

Global site tag (gtag.js) - Google Analytics