貌似经常听过过NUnit,但从来没用过,算是一个很不合格的程序员,所以花点时间好好补一下了。
参考博客园里Confach的一篇文章:
http://www.cnblogs.com/confach/archive/2005/06/20/177817.html
下面算是学习时候的一些笔记了。
1. TDD (Test Driver Development)
两个个原则:
. 除非你有一个失败的自动测试,永远不要写一单行代码
. 组织重复
这是文章里的原话了,第二个原则很好理解,代码重复是需要尽量避免的。 第一个不晓得是不是翻译的原因,看了好久还是
很模糊,作者的解释倒是看懂了: 在没有 失败的自动测试下就不要写代码; 因为测试是嵌入在代码必须满足的需求中, 如
果没有需求,就没有必要实现任何东西,所以这个原则阻止我们去实现那些没有测试和在解决方案中不需要的功能。
测试的两种类型:
客户的测试: 推荐框架 - FIT
程序员自己的测试: NUnit
2. NUnit
NUnit说白了就是for .net的。
附个下载地址,免得自己忘记了: http://www.nunit.org/
工具界面还有如何引用什么的就不介绍了,多用几遍就熟了。 继续记录一些常用的属性:
TestFixtureAttribute
作用: 标记一个类包含测试
被标记的类还需要有一些限制:
一般类都有有一个缺省的构造函数, 至于这里的副作用,不知道是不是指其他对象的一些操作之类的,比如删除,插入,计
算等。。。
TestAttribute
作用:标记一个类(已标记为TestFixture)的某个方法是可以测试的。
测试方法的限制:
这两个属性是最基本的。 测试方法没有参数,也无法返回参数,一般我们用Assert(断言)进行比较。
3. 在.Net中使用NUnit
这里在设置NUnit作为启动程序的时候需要注意一下了,在VS2008中,是在对应的Project上,右击,选择“属性”,然后
的“Debug”中,去修改“start external program"的值。
4. 其他的一些核心概念
Setup/TearDown属性
作用: 常规的初始化/清除
如果一些测试方法中有一些重复的初始化代码,这时候可以把这些代码提取到一个独立的方法,然后将该方法标记为
Setup。 当然了,方法必须为public, 测试了一下, 发现实际上每个测试方法在执行的时候都会把这个初始化方法执行一
遍,不是那种只初始化一次。
ExpectedException
作用: 在执行过程中捕获期望的异常类型。
比如除法中,被除数为0会导致异常。 这时候我们预期异常类型为: DivideByZeroException, 并在方法上标记
ExpectedException属性,指定类型为DivideByZeroException。 如果指定其他的异常类型,测试方法就会报错, 因为
期望的异常类型和实际的不一致。
Ignore
作用:暂时不执行测试方法
也可以附加到整个测试类,那样类中的所有测试都会被忽略。
TestFixtureSetup/TestFixtureTearDown
作用: 标记为整个TestFixture初始化/释放资源
对于整个TestFixture而言,只执行一次,所以不需要在执行每个测试方法的时候,都执行该方法了。
Suite
作用:testCase或其他test Suite的集合
测试代码中的TestSuite类,并没有查询到,所以这个属性还待研究。。。。。
Category
作用:将测试分类
将测试分类,这样我们可以选择只执行某一类或某几个类别的测试。
Explicit
作用: 忽略一个test和test fixture,直到他们显式的选择执行。
测试发现,如果设置属性为ignore,那么会显示为黄色进度条,而且无法手动的执行。 如果属性为Explicit,那么自动执行的时候会
忽略该方法,但是可以手动选择执行。
5. 测试生命周期合约
setup/teardown方法提供达到测试隔离性的目的。 Setup确保共享的资源在每个测试运行前正确初始化, TearDown确
保没有运行测试产生的遗留副作用。 TestFixtureSetup/TestFixtureTearDown类似,只是在TestFixture范围,这4个
一起组成了测试框架的运行时容器(test runner)和测试之间的生命周期合约(life-cyle contract)