单元测试一直以来感觉很神秘。为什么要进行单元测试,到底什么才是正确的单元测试方法?单元测试和白盒测试有区别吗?
这些问题一直困扰着我,今天大概唠叨一下,个人的想法,不一定正确哦。
1.为什么要进行单元测试
单元测试可以测试一个小的单元(一个类或方法),确保这个单元是与预期相符的,这样就可以在更大级别的测试中尽量减少单元的问题的干扰,当软件发生bug时,就可以更快的定位到问题具体所在,解决bug。
2.首先闹明白什么是 单元测试:
假设我们生产电脑的一个零件,我们会考虑组成这个零件的每一个最小组部分成是否合格,是否符合我们的预期。为了达到这个目的我们会对这些最小部分进行测试,其实这就是单元测试。
而在我们软件里可以这样定义,单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确,这个很小的可以是一个类或一个方法,通常,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。检查它是否符合我们的预期。
根本目的:检查
在尽量多的情况下,单元的工作是否符合预期。
3.到底怎样进行单元测试呢

1)准备测试所需要的各种条件(创建所有必须的对象,分配必要的资源等)

包括各种有代表性的合法测试数据,可以使用边界值法,还可以使用各种非法数据,检查是否抛出指定的异常。

2)调用要测试的方法。

3)验证被测试的方法的行为和期望是否和我们的一致。

4)完成后清理各种资源

4.单元测试和白盒测试的关系
个人认为单元测试是在规模的角度看待的,而白盒测试是在测试方法进行分类的。按照规模测试应分为单元测试、功能测试、集成测试、整体测试。
在测试方法上测试又分为白盒测试和黑盒测试。单元测试可以使用白盒测试的技巧也可以不使用,目的是尽可能多的检验单元的正确性。
5.常用的测试框架

1)NUnit:目前最高版本为2.2.7(也是本文所使用的NUnit的版本)
下载地址:http://www.nunit.org
2)TestDriven.Net:一款把NUnit和VS IDE集成的插件
下载地址:http://www.testdriven.net/
3)NUnit2Report:和nant结合生成单元测试报告
下载地址:http://nunit2report.sourceforge.net
4)Rhino Mocks 2:个人认为时.net框架下最好的mocks库,而且支持.net 2.0, rocks~!
下载地址:http://www.ayende.com/projects/rhino-mocks.aspx
6.基于Visual Studio 的单元测试
1)
NUnit提供了以下Attribute来支持测试函数的初始化:
TestFixtureSetup:在当前测试类中的所有测试函数运行前调用;
TestFixtureTearDown:在当前测试类的所有测试函数运行完毕后调用;
Setup:在当前测试类的每一个测试函数运行前调用;
TearDown:在当前测试类的每一个测试函数运行后调用。
这些属性可以典型用于数据库相关的例子。
还有category、suite等。
2)常使用断言Assert常用的NUnit断言有:

method

usage

example

Assert.AreEqual(object expected, object actual[, string message])

验证两个对象是否相等

Assert.AreEqual(2, 1+1)

Assert.AreSame(object expected, object actual[, string message])

验证两个引用是否指向同意对象

object expected = new object();

object actual = expected;

Assert.AreSame(expected, actual)

Assert.IsFalse(bool)

验证bool值是否为false

Assert.IsFalse(false)

Assert.IsTrue(bool)

验证bool值是否为true

Assert.IsTrue(true)

Assert.IsNotNull(object)

验证对象是否不为null

Assert.IsNotNull(new object())

Assert.IsNull(object)

验证对象是否为null

Assert.IsNull(null);

遇到无返回值的方法,可以构造值来进行判断。能 显示测试的报表,明显的显示bug的具体位置。

7.推荐文章
http://blog.csdn.net/fenghu89/archive/2008/05/04/2379128.aspx
http://www.cnblogs.com/chwkai/archive/2006/03/23/356326.html
http://www.uml.org.cn/Test/200604215.htm