为祖国软件测试事业添砖加瓦!

关于Nunit!C#单元测试工具

上一篇 / 下一篇  2007-07-19 21:17:47

51Testing软件测试网W%_ W xp

这两天研究了两天的Nunit,谈一下我对Nunit的认识~

;L-Lkak}9Io0

$y,b)[aUW;rc9\0G0Nunit是C#的单元测试工具,现在用Nunit进行单元测试的。51Testing软件测试网#hp,OQR/opd

h,}"U6FE q8X6W)P _0目前使用Nunit的公司,很多是采用TDD开发模式的公司。所谓的TDD就是“测试驱动开发”的敏捷开发模式。51Testing软件测试网w!Z9QG/`HJ Z*E

s^.r*g&` i0举个例子说明一下,什么叫做“测试驱动开发”模式:51Testing软件测试网2e8J*S7x3o~{6qX

b%t4qu\0(例子摘自51testing)

J[.|{C iWX0

'SMy,T xn0使用NUnit在.Net编程中进行单元测试51Testing软件测试网 `$If}*SN
51Testing软件测试网+Pos7p!h,|
51Testing软件测试网:dl0_/fr$h)mo

我收集的,大家有兴趣可以看看,不过实际的执行图片我发不上来,大家将就一下咯51Testing软件测试网!d.JL$d6[
内容:51Testing软件测试网Sf7s'J;{5c*v
摘要:
(O(R DLj Ka|0本文通过一个详实的例子,详细介绍了如何在C#中利用NUnit单元测试框架进行应用程序类的单元测试工作
I9wB"J_:K2lv)F D051Testing软件测试网9A)DX'Fy
--------------------------------------------------------------------------------51Testing软件测试网 J;O e3O Y|

wq-ra;S/Db*G0目录:
x3ZU'bR4D7l:Mz7qD0引言
.ek7VYr/|Bv6s0什么是单元测试
;x'qt%H G6Ru5K }7W _0测试先行
3M/F'@(z.z$O-W)P&IT0测试异常51Testing软件测试网7f$_:C5B ?:\2H`
总结51Testing软件测试网2f2r)P&Gp xG~(|'?
51Testing软件测试网_x?(~d ^0]9u3X;?
--------------------------------------------------------------------------------
J c4]2h$G'p GB0
M5D,b0\Uk1Xe'Ky0引言:
(S7B6mbe!e0举一个可能会发生在你身边的事件将更能贴近实际,幸好我们现在就有一件在程序员看来非常普通的任务:51Testing软件测试网 k!uQ o!sf,^N~&R$f
你今天第一天上班,你的项目经理拿给你一叠不算厚的文档,告诉你今天的任务是按照文档中的要求编写一个.Net类,可能因为任务并不复杂,所以他看上去非常的随意。
f9Sxj*zg5bu0今天能否很好的完成任务对你来说非常特殊,你拿过来后快速略过了前面大段的项目介绍,因为你知道那些对你并不重要,印象中好象是一个关于售票系统的工程。很快,你找了你需要关注的重点:类的需求说明文档。你详细的看了一遍,感觉并不复杂,类名Ticket,有一个只读的int型公共的属性,名称是Amount,还有两个方法,一个是名称是Sell,功能是将Amount减去一,表示卖掉了一张票,当然,票可不能为负数,如果是的话,抛出一个异常说明原因。另一个是Add,它有一个int型的参数,功能是将这个参数的值加到Amount中去,可能是表示进票之类的事情吧,你不太关心,反正这个程序很简单,你掩饰住内心的狂喜,打开电脑,调出编辑器,开始准备写程序了。
;WUD@P a p2y0"喂,等等",项目经理不知道什么时候又转回来了,"我想知道你打算怎么进行单元测试,我最关心的是这个"。
ps q6r6Z0"什么是单元测试?"你转过头一脸沮丧的看着失望的项目经理。51Testing软件测试网S5G3j mMTMoi
51Testing软件测试网8yi(m E(p7S,H
--------------------------------------------------------------------------------51Testing软件测试网-A\M2E+o xXW5X
51Testing软件测试网l%Y2xP/~5{4e&e
什么是单元测试:51Testing软件测试网bo:F6K i\
在程序设计过程中会有许多种测试,单元只是其中的一种,单元测试并不能保证程序是完美无缺的,但是在所有的测试中,单元测试是第一个环节,也是最重要的一个环节。单元测试是一种由程序员自行测试的工作。简单点说,单元测试就是测试代码撰写者依据其所设想的方式执行是否产生了预期的结果。关于单元测试的重要性已经有许多文章做了很多深入的分析,这里就不再赘述。51Testing软件测试网o(D$C2Za j!QG
NUnit是一个为Net准备的自动化单元测试框架,它的作用就是帮助你方便的完成单元测试工作,同鼎鼎有名的JUnit一样,都是xUnit家族的成员。它的下载地址是:
http://www.nunit.org51Testing软件测试网#k f1N)j3KV}

f`-fa!~J$Js$U(a0--------------------------------------------------------------------------------
0]?A Z;H k7c*jPG;~0
eUO&sC0测试先行:
o"`L+o+@ ]2qoEstt/N0"什么?先写测试?"你一定非常惊讶,对!就是先来编写测试代码,按照极限编程(XP)的理论,写测试就是对软件进行设计的过程,它的重要性甚至超过了实际完成功能的代码。先将测试写完,然后再来完成代码,这样,所有的测试通过之日也就是程序完成之时。51Testing软件测试网JP!M ]/{M dM
首先,我们将NUnit提供的要nunit.framework.dll文件引入到工程中,并创建一个名为TicketTest的类:
X;i.WY0zjh0[TestFixture]
7x1o2S} P0        public class TicketTest51Testing软件测试网7Hgj Jg`SD(w
        {
'f5y*U#T/U#`4D ]0                [Test]
6t.| }+XW0                public void Add()
_ h9HV0O0                {
8NU;AF OuJ:j0                        Ticket ticket = new Ticket();
{V%y-l(lg6Ut!l0                        ticket.Add(100);
xvAm C-J0                        Assertion.AssertEquals(100, ticket.Amount);
a5q;vAC0                }
0h/u t(Yi8e&p0        }51Testing软件测试网7j5v I3k s"f

)t:p;c'xdtuLV I Sv0注意,其中的[TestFixture]和[Test]两个Attribute为NUnit所规定必须要添加的,这样,测试框架就可以知道哪些类或者方法需要进行测试。
#Z#A6~c)KTc0@b@p0我们在Add方法中定义了一个ticket对象,并给他加了100张票,然后就可以使用:
X0az?#We0Assertion.AssertEquals(100, ticket.Amount);
4@ qi2_*`Q(kO0来测试ticket的Amount属性是否确实为100。
n#nTfps Z]#|0接下来,我们再向TicketTest中添加一个测试Sell的方法:
,Mdu ~,E0[Test]51Testing软件测试网e!Q sAqz
                public void Sell()
4tnLH8q0                {
tZKu:A Q N"vm0                        Ticket ticket = new Ticket();
t(u.}V!OKBr[0                        ticket.Add(100);
!WT _9\1I3X4p0                        ticket.Sell();
NWZV(X^ ?u)_ O^+[~0                        ticket.Sell();
/Q,D&J q V/pC1e;a:^e(]0                        ticket.Sell();
1f'Og2q3?g0                        Assertion.AssertEquals(97, ticket.Amount);
)sQ0?*O.P+z,v ~0                }
D*r.OzLt*XT;il051Testing软件测试网r3w3A3T8R!b'nxlO
这里,我们先加了100张票之后就一口气卖掉了3张,然后看看我们是否还剩下97张票。
2v.sLT9^9qo0好了,这两个方法的测试已经做完了,我们来看一下测试的结果,根据要求,我们写了如下代码:
{P*dUH{#Q0public class Ticket
-I8A'k*Ww:]0        {51Testing软件测试网*V `jhOe ij
                private int amount;51Testing软件测试网z(Y$b9E4nl
                public int Amount51Testing软件测试网v'Z1V,L0I9x I
                {51Testing软件测试网U7dL tg8I%i ~
                        get
xL S*e [9C3o!y!b0                        {
){n5[u$o0                                return amount;51Testing软件测试网vk'c4K)O$d;o
                        }51Testing软件测试网 y2w(dH KSj$V
                }51Testing软件测试网:b1zr y7LqW0K0N q7v:{

.k1S;G7|p0                public void Add(int num)51Testing软件测试网z9C0AJ"\)s
                {51Testing软件测试网z&i+fN%K?R1Gn3e
                }51Testing软件测试网 R-~ A(}g
51Testing软件测试网 q9Q)B{9o"W7rO:A
                public void Sell()51Testing软件测试网 h*X*L+^5d._FH)p n5e
                {51Testing软件测试网z0O(Q/K"d8D
                }
6}Cl0}Zf&D'A0}51Testing软件测试网7Yfc[.gr

rYT,NO0注意这段代码只是为了完成类的结构,方法的实现暂时先空着。然后将这段代码编译成一个dll动态连接库文件:UnitTest.dll。
Hg!L r%D5G'so0b@0我们运行NUnit的图形测试工具,打开我们编译好的dll文件,点"Run"按纽,就可以看到如下画面:51Testing软件测试网O;L"rf0f6O

&Q2Yh3o'aC0
] l2Q$qW.DB+e0很醒目红色,表示测试并没有成功,不过这个是在我们的预料之中的。51Testing软件测试网7n;Uz!x%\ i4UK,C
接下来,我们向刚才的Ticket类中完成我们的Add方法实现代码:51Testing软件测试网-Q)R n |.Y8e
public void Add(int num)51Testing软件测试网Oz%Qf:O1f&Ro
{
9Hrp:`)H?H0amount += num;51Testing软件测试网e&j(D$C'ms
}
%vuY&a(A$lC0保存,重新编译。51Testing软件测试网%TVKM&[G
切换到NUnit,再点Run,可以看到:
8U3r:W }#~^[I*gy0
~1I^0xz*KZ m}051Testing软件测试网}+?n ~Re.fy
Add方法已经变成绿色了,再接着将Sell方法也完成:51Testing软件测试网 Hl0g:m5I
public void Sell()
[5BYt.t{J0{
l Uf-Y&ke%j0amount -= 1;
!dbJ,U?w0}
7\N _m1[3fVn0再来测试,结果就变成:51Testing软件测试网\5y x+t"Zc
51Testing软件测试网iME?MMi4h.Pt

!W5Vr8mcG"m0啊,总算变成美丽的绿色了,大家现在体会到环保的重要性了吧。 :)51Testing软件测试网_l1Yof9C
那么可以交任务了吗?等等,别急,还有个异常没测试呢,如果我们的Amount小于0的话,就会产生异常,那么,异常怎么测试呢?请接着看。
"h0^ t:]w]\_Sr]0
%C*Ku@t*Cd#z0--------------------------------------------------------------------------------
t!kv7S+}%Y051Testing软件测试网e'M;C^Sd m
测试异常:51Testing软件测试网MH%jj HZ#p
还是跟上面一样,先写出测试代码:51Testing软件测试网 I.k-V8^A Kg2P
[Test]51Testing软件测试网/r+WK4VD/\n
        [ExpectedException(typeof(Exception))]51Testing软件测试网RF!i}^m
        public void ExcpetionTesting()
U|%`"{C5]t%A O0        {
*un3gM2Qn7XO0                Ticket ticket = new Ticket();
K+w_(V/{*Mx]h4j0                ticket.Add(3);51Testing软件测试网;rx\Edm
                ticket.Sell();51Testing软件测试网 EG2v0v&X
                ticket.Sell();51Testing软件测试网L$Vt/b-P2^#T7@
                ticket.Sell();51Testing软件测试网`nM+D0cJ}
                ticket.Sell();51Testing软件测试网Cz8`xY.F
        }
ChfzU3Wi0
nB/eAW9Z;p0其中,[ExpectedException(typeof(Exception))]表示我们希望能捕获到发生的异常,如果没有捕获到异常,则表示测试失败。
v+`8QMj5P7k0后面的代码很好理解,我们加了三张票,却卖了四张出去,这可不是炒股,以后没办法平仓的。 :)51Testing软件测试网%C \9Hn q-OFs"Tl
编译运行,我们看到以下的测试画面:51Testing软件测试网o1?jL(~S
51Testing软件测试网F"esaz$L#z
51Testing软件测试网a cH#Ewf K
在Ticket类中,我们修改一下Sell方法,让它变成:51Testing软件测试网"qM,I'tZ"X"\&LC
public void Sell()51Testing软件测试网ll~ak9va|
{
ltH'?^tRT0if(amount - 1 < 0)
\(GWM3p9}x0throw new Exception("Amount不能为0");51Testing软件测试网#__']A.Uklb A:[
amount -= 1;51Testing软件测试网^;B:FPl/w
}
ThYJr4[kwm0编译,再测试,结果如下:
}c*j }szf1|051Testing软件测试网,J2G!?X_em4IK9_ X#Y p

*@;R!m4?y+EO)f F0好了,到了这里就算完成我们的单元测试之旅了,大家对如何在C#中进行单元测试一定已经有了一个基本的认识。另外,NUnit并不是只针对C#,事实上,你可以在任何.Net语言中使用NUnit来测试你的单元,方法都一样。51Testing软件测试网-sP8J f-c[ \!Q\
51Testing软件测试网 a$O Odf1T&Pk$~8L
--------------------------------------------------------------------------------51Testing软件测试网xmF/g? MV.C
51Testing软件测试网q/xB8Jv"Cm"a`
总结:
+BuM+T]vi5x0单元测试看上去虽然有点麻烦,但是它为程序员提供了一个安全的观点,让程序员对自己的程序更加有信心,在减少开发后期进行频繁Debug所耗费时间的同时也为应用软件提供了第一道安全防护网,因此,单元测试是提高开发效率和软件品质的一个重要的手段。
#t7`;bG F0利用UNint,我们可以在.Net编程过程中非常方便的进行单元测试,它图形化的界面和简单而强大的测试框架为我们提供了一个非常舒适而有趣的测试环境,能够让程序员觉得进行单元测试并不枯燥乏味,习惯后甚至还能成为一种乐趣。
+[OeD5g7e0看完本文,如果你是引言中那个可怜的程序员的话,你现在就一定能轻松的面对你的项目经理,交上一份令人放心的代码答卷。

TAG: NUnit

 

评分:0

我来说两句

我的栏目

日历

« 2024-04-20  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 12798
  • 日志数: 19
  • 建立时间: 2007-07-18
  • 更新时间: 2011-08-09

RSS订阅

Open Toolbar