本文仅提供了public 思路方法
![](http://www.crazycoder.cn/icons/58532de.gif)
测试介绍说明
![](http://www.crazycoder.cn/icons/58532dou2.gif)
及前期工作和常用
![](http://www.crazycoder.cn/icons/58532de.gif)
断言和测试attribute
NUNIT使用介绍说明
![](http://www.crazycoder.cn/icons/58532yi.gif)
:软件Software及安装
免费
![](http://www.crazycoder.cn/icons/58532dou.gif)
开源
![](http://www.crazycoder.cn/icons/58532de.gif)
单元测试软件Software
安装只要运行安装
![](http://www.crazycoder.cn/icons/58532dou.gif)
按所有缺省设置即可
NUNIT:www.nunit.org
NUNIT ADDIN :http://sourceforge.net/projects/nunitaddin/
2:DLL
![](http://www.crazycoder.cn/icons/58532de.gif)
测试
1:新建
![](http://www.crazycoder.cn/icons/58532yi.gif)
个Class Library PROJECT
2:加入待测试DLL
![](http://www.crazycoder.cn/icons/58532de.gif)
引用
3:加入NUnit.Framework.dll
![](http://www.crazycoder.cn/icons/58532de.gif)
引用
4:在文件开头加入:using NUnit.Framework
5:在待测试
![](http://www.crazycoder.cn/icons/58532de.gif)
类前加入:[TestFixture]
6:在待测试
![](http://www.crazycoder.cn/icons/58532de.gif)
思路方法前加入:[Test]
7:启动NUNIT-GUI,新建项目
![](http://www.crazycoder.cn/icons/58532dou.gif)
将新建
![](http://www.crazycoder.cn/icons/58532de.gif)
Class Library PROJECT加入
![](http://www.crazycoder.cn/icons/58532dou.gif)
执行
3:Attribute介绍
1:TestFixture:每个待测试
![](http://www.crazycoder.cn/icons/58532de.gif)
类前必须加该Attribute
【注意】待测试类需要有
![](http://www.crazycoder.cn/icons/58532yi.gif)
个public
![](http://www.crazycoder.cn/icons/58532de.gif)
default constructor(或者是没有定义任何
![](http://www.crazycoder.cn/icons/58532de.gif)
constructor)
2:Test:每个测试
![](http://www.crazycoder.cn/icons/58532de.gif)
类中待测试
![](http://www.crazycoder.cn/icons/58532hanshu.gif)
前必须加该Attribute
【注意】有Test attribute
![](http://www.crazycoder.cn/icons/58532de.gif)
method必须是public
![](http://www.crazycoder.cn/icons/58532dou.gif)
并且必须
![](http://www.crazycoder.cn/icons/58532return.gif)
void
![](http://www.crazycoder.cn/icons/58532dou.gif)
也没有任何传入
![](http://www.crazycoder.cn/icons/58532de.gif)
参数
![](http://www.crazycoder.cn/icons/58532dou2.gif)
如果没有符合这些规定
![](http://www.crazycoder.cn/icons/58532dou.gif)
在Test Runner GUI的中是不会列出这个method
![](http://www.crazycoder.cn/icons/58532dou.gif)
而且在执行Unit Test
![](http://www.crazycoder.cn/icons/58532de.gif)
时候也不会执行这个method
3:TestFixtureSetUp 和TestFixtureTearDown介绍
这两个主要用在TestFixture里面
![](http://www.crazycoder.cn/icons/58532dou.gif)
其作用是提供
![](http://www.crazycoder.cn/icons/58532yi.gif)
组
![](http://www.crazycoder.cn/icons/58532hanshu.gif)
执行任何测试运行的前(TestFixtureSetUP)和最后
![](http://www.crazycoder.cn/icons/58532yi.gif)
个测试执行后(TestFixtureTearDown)
![](http://www.crazycoder.cn/icons/58532dou2.gif)
每
![](http://www.crazycoder.cn/icons/58532yi.gif)
个TestFixture只能有
![](http://www.crazycoder.cn/icons/58532yi.gif)
个TestFixtureSetUp思路方法和TestFixtureTearDown思路方法
![](http://www.crazycoder.cn/icons/58532dou2.gif)
如果
![](http://www.crazycoder.cn/icons/58532yi.gif)
个以上
![](http://www.crazycoder.cn/icons/58532de.gif)
TestFixtureSetUp和TestFixtureTearDown思路方法
![](http://www.crazycoder.cn/icons/58532dou.gif)
可以通过编译但是不会执行
![](http://www.crazycoder.cn/icons/58532dou2.gif)
注意
![](http://www.crazycoder.cn/icons/58532yi.gif)
个TestFixture可以拥有
![](http://www.crazycoder.cn/icons/58532yi.gif)
个TestFixtureSetUp和
![](http://www.crazycoder.cn/icons/58532yi.gif)
个SetUp
![](http://www.crazycoder.cn/icons/58532dou.gif)
也可以拥有
![](http://www.crazycoder.cn/icons/58532yi.gif)
个TestFixtureTearDown和
![](http://www.crazycoder.cn/icons/58532yi.gif)
个TearDown思路方法
TestFixtureSetUp 和 TestFixtureTearDown 被用在不方便使用SetUp和TearDown思路方法
![](http://www.crazycoder.cn/icons/58532yi.gif)
般情况使用 SetUp 和TearDown attributes
4:SetUp 和 Teardown Attributes介绍
在写Unit Tests
![](http://www.crazycoder.cn/icons/58532de.gif)
时候
![](http://www.crazycoder.cn/icons/58532dou.gif)
有时你会需要在执行每
![](http://www.crazycoder.cn/icons/58532yi.gif)
个test method的前(或的后)先作
![](http://www.crazycoder.cn/icons/58532yi.gif)
些预备或善后工作
![](http://www.crazycoder.cn/icons/58532dou2.gif)
当然
![](http://www.crazycoder.cn/icons/58532dou.gif)
你可以写
![](http://www.crazycoder.cn/icons/58532yi.gif)
个private
![](http://www.crazycoder.cn/icons/58532de.gif)
method
![](http://www.crazycoder.cn/icons/58532dou.gif)
然后在每
![](http://www.crazycoder.cn/icons/58532yi.gif)
个test method
![](http://www.crazycoder.cn/icons/58532yi.gif)
开头或最末端呼叫这个特别
![](http://www.crazycoder.cn/icons/58532de.gif)
method
![](http://www.crazycoder.cn/icons/58532dou2.gif)
或者
![](http://www.crazycoder.cn/icons/58532dou.gif)
你可以使用我们要介绍
![](http://www.crazycoder.cn/icons/58532de.gif)
SetUp及Teardown Attributes来达到相同
![](http://www.crazycoder.cn/icons/58532de.gif)
目
![](http://www.crazycoder.cn/icons/58532dou2.gif)
如同这两个Attributes
![](http://www.crazycoder.cn/icons/58532de.gif)
名字
![](http://www.crazycoder.cn/icons/58532de.gif)
意思
![](http://www.crazycoder.cn/icons/58532dou.gif)
有Setup Attribute
![](http://www.crazycoder.cn/icons/58532de.gif)
method会在该TextFixture中
![](http://www.crazycoder.cn/icons/58532de.gif)
每
![](http://www.crazycoder.cn/icons/58532yi.gif)
个test method被执行的前先被Test Runner所执行
![](http://www.crazycoder.cn/icons/58532dou.gif)
而有Teardown Attribute
![](http://www.crazycoder.cn/icons/58532de.gif)
method则会在每
![](http://www.crazycoder.cn/icons/58532yi.gif)
个test method被执行的后被Test Runner所执行
![](http://www.crazycoder.cn/icons/58532yi.gif)
般来说
![](http://www.crazycoder.cn/icons/58532dou.gif)
Setup Attribute及Teardown Attribute被用来预备
![](http://www.crazycoder.cn/icons/58532yi.gif)
些必须
![](http://www.crazycoder.cn/icons/58532de.gif)
objects(对象)
![](http://www.crazycoder.cn/icons/58532dou.gif)
例如database connection、等等
5:Attribute介绍说明
TestFixture:每个待测试
![](http://www.crazycoder.cn/icons/58532de.gif)
类前必须加该Attribute
Test:每个测试
![](http://www.crazycoder.cn/icons/58532de.gif)
类中待测试
![](http://www.crazycoder.cn/icons/58532hanshu.gif)
前必须加该Attribute
TestFixtureSetUp:在
![](http://www.crazycoder.cn/icons/58532yi.gif)
个测试类中只执行
![](http://www.crazycoder.cn/icons/58532yi.gif)
次
![](http://www.crazycoder.cn/icons/58532dou.gif)
且在所有测试案例运行前执行
SetUp:在每个测试案例运行前执行
ADD:测试案例1
TearDown:在每个测试案例运行后执行
SetUp:在每个测试案例运行前执行
Sub:测试案例2
TearDown:在每个测试案例运行后执行
TestFixtureTearDown:在
![](http://www.crazycoder.cn/icons/58532yi.gif)
个测试类中只执行
![](http://www.crazycoder.cn/icons/58532yi.gif)
次
![](http://www.crazycoder.cn/icons/58532dou.gif)
且在所有测试案例运行后执行
ExpectedException:检测抛出异常
[Test]
[ExpectedException(typeof(InvalidOperationException))]
[Test,ExpectedException(typeof(InvalidOperationException))]
Ignore :临时忽略
![](http://www.crazycoder.cn/icons/58532yi.gif)
些测试
Ignore(“Not ready to test this yet”);
4:NUNIT
![](http://www.crazycoder.cn/icons/58532de.gif)
各种断言
断言用于帮助你确定某个被测试
![](http://www.crazycoder.cn/icons/58532hanshu.gif)
是否工作正常
![](http://www.crazycoder.cn/icons/58532dou.gif)
通常
![](http://www.crazycoder.cn/icons/58532yi.gif)
个测试思路方法中会有多个断言
![](http://www.crazycoder.cn/icons/58532dou.gif)
当
![](http://www.crazycoder.cn/icons/58532yi.gif)
个断言失败时
![](http://www.crazycoder.cn/icons/58532dou.gif)
该测试思路方法就会终止
![](http://www.crazycoder.cn/icons/58532dou2.gif)
可使用Assert或Assertion
![](http://www.crazycoder.cn/icons/58532diaoyong.gif)
断言
1:AreEquals(expected,actual[,
![](http://www.crazycoder.cn/icons/58532string.gif)
message])
Expected是被测试代码
![](http://www.crazycoder.cn/icons/58532de.gif)
期望值
![](http://www.crazycoder.cn/icons/58532dou.gif)
actual是被测试代码
![](http://www.crazycoder.cn/icons/58532de.gif)
实际值
![](http://www.crazycoder.cn/icons/58532dou.gif)
message是
![](http://www.crazycoder.cn/icons/58532yi.gif)
个可选
![](http://www.crazycoder.cn/icons/58532de.gif)
消息
![](http://www.crazycoder.cn/icons/58532dou.gif)
在 2个值不
![](http://www.crazycoder.cn/icons/58532yi.gif)
致时报告
![](http://www.crazycoder.cn/icons/58532dou2.gif)
Expected和actual可以是
![](http://www.crazycoder.cn/icons/58532yi.gif)
个对象
对于浮点数
![](http://www.crazycoder.cn/icons/58532de.gif)
比较
![](http://www.crazycoder.cn/icons/58532dou.gif)
使用AreEquals(expected,actual,tolerance[,
![](http://www.crazycoder.cn/icons/58532string.gif)
message]),其中
![](http://www.crazycoder.cn/icons/58532dou.gif)
tolerance表示精度
![](http://www.crazycoder.cn/icons/58532dou.gif)
0.01表示仅比较小数后 2位
2:IsNull/IsNotNull(object[,
![](http://www.crazycoder.cn/icons/58532string.gif)
message])
判断
![](http://www.crazycoder.cn/icons/58532yi.gif)
个对象是空/非空
3:AreSame(expected,actual[,
![](http://www.crazycoder.cn/icons/58532string.gif)
message])
判断Expected和actual是否是同
![](http://www.crazycoder.cn/icons/58532yi.gif)
个对象
4:IsTrue(bool condition[,
![](http://www.crazycoder.cn/icons/58532string.gif)
message])/IsFalse
判断条件是否为真/假
5:Fail([
![](http://www.crazycoder.cn/icons/58532string.gif)
message])
使测试立即失效
5:异常处理
NUNIT框架可以捕获任何异常
![](http://www.crazycoder.cn/icons/58532dou.gif)
并且把它报告为
![](http://www.crazycoder.cn/icons/58532yi.gif)
个
![](http://www.crazycoder.cn/icons/58532dou.gif)
这些都不需要用户
![](http://www.crazycoder.cn/icons/58532de.gif)
参和
6:测试用例编写
NUNIT使用断言业判断待测试代码是否返回正确
![](http://www.crazycoder.cn/icons/58532de.gif)
结果
![](http://www.crazycoder.cn/icons/58532dou.gif)
在编写测试用例
![](http://www.crazycoder.cn/icons/58532de.gif)
过程中
![](http://www.crazycoder.cn/icons/58532dou.gif)
经常需要有
![](http://www.crazycoder.cn/icons/58532yi.gif)
个正确
![](http://www.crazycoder.cn/icons/58532de.gif)
值作为依据
![](http://www.crazycoder.cn/icons/58532dou.gif)
和测试代码返回
![](http://www.crazycoder.cn/icons/58532de.gif)
值进行比较
![](http://www.crazycoder.cn/icons/58532dou2.gif)
在有些情况下
![](http://www.crazycoder.cn/icons/58532dou.gif)
可以比较容易地取到这些正确
![](http://www.crazycoder.cn/icons/58532de.gif)
值
![](http://www.crazycoder.cn/icons/58532dou.gif)
但有时要取得这些正确
![](http://www.crazycoder.cn/icons/58532de.gif)
值并不容易
![](http://www.crazycoder.cn/icons/58532dou2.gif)
如在从数据库取数据时
![](http://www.crazycoder.cn/icons/58532dou.gif)
难以设定
![](http://www.crazycoder.cn/icons/58532yi.gif)
个正确
![](http://www.crazycoder.cn/icons/58532de.gif)
值
![](http://www.crazycoder.cn/icons/58532dou.gif)
在这种情况下
![](http://www.crazycoder.cn/icons/58532dou.gif)
最好使用
![](http://www.crazycoder.cn/icons/58532yi.gif)
些已被测试是正确
![](http://www.crazycoder.cn/icons/58532de.gif)
或商用
![](http://www.crazycoder.cn/icons/58532de.gif)
模块
![](http://www.crazycoder.cn/icons/58532dou.gif)
将这些测试过
![](http://www.crazycoder.cn/icons/58532chengxu.gif)
或商用模块返回
![](http://www.crazycoder.cn/icons/58532de.gif)
值作为正确
![](http://www.crazycoder.cn/icons/58532de.gif)
值
![](http://www.crazycoder.cn/icons/58532dou.gif)
作为
![](http://www.crazycoder.cn/icons/58532yi.gif)
个比较参照
![](http://www.crazycoder.cn/icons/58532dou2.gif)
<script type=text/javascript>
</script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </script> <script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script> <script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script> <script>window.google_render_ad();</script>