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

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

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

Aezv w0i+e0这两天研究了两天的Nunit,谈一下我对Nunit的认识~51Testing软件测试网&wK`#Q,ok7n

51Testing软件测试网5p5kZbP+NW.E ]\

Nunit是C#的单元测试工具,现在用Nunit进行单元测试的。

"}1FI&e8P\^8{5K051Testing软件测试网0F3A'OzAy e:Mnz^

目前使用Nunit的公司,很多是采用TDD开发模式的公司。所谓的TDD就是“测试驱动开发”的敏捷开发模式。

BV A3c u0

"X1UY+M0u9J-\0举个例子说明一下,什么叫做“测试驱动开发”模式:

qP{U;O u[0

yV"D-g0x\0(例子摘自51testing)

iLY(E5m EDn W051Testing软件测试网2r.O+?$vL5U/F[-J

使用NUnit在.Net编程中进行单元测试51Testing软件测试网:E[)Bt U(F`G s'a9y

],]"c`tc0M V/a0
51Testing软件测试网-V5CBW!`|:u2~

我收集的,大家有兴趣可以看看,不过实际的执行图片我发不上来,大家将就一下咯51Testing软件测试网iSX+?0o
内容:51Testing软件测试网#~X;vE?a,}.Ez
摘要:
2od,\/q4HF^S,i!y&Bk0本文通过一个详实的例子,详细介绍了如何在C#中利用NUnit单元测试框架进行应用程序类的单元测试工作51Testing软件测试网 w|7p(wZ.@B+Wy

io|(q]l4tl1a4m,f/L0--------------------------------------------------------------------------------
A+J}1Y&iSUJVg051Testing软件测试网L~\7Tp
目录:
/N9@&x*@s$E0引言51Testing软件测试网 _f_\ yuB
什么是单元测试51Testing软件测试网8H0G/G8\M_*omd
测试先行
6a u%S g K:Y\&T1a1l0测试异常51Testing软件测试网^{C%vEFC1|
总结51Testing软件测试网6W~nS#aG.@I3P

C\GZ$UR,Man0--------------------------------------------------------------------------------
fF Wx0CD051Testing软件测试网rW0y2@U
引言:
v2dL3SCP3q0举一个可能会发生在你身边的事件将更能贴近实际,幸好我们现在就有一件在程序员看来非常普通的任务:
rC9oH1Q,ikj0你今天第一天上班,你的项目经理拿给你一叠不算厚的文档,告诉你今天的任务是按照文档中的要求编写一个.Net类,可能因为任务并不复杂,所以他看上去非常的随意。
Tw ^2fA8q N2g0今天能否很好的完成任务对你来说非常特殊,你拿过来后快速略过了前面大段的项目介绍,因为你知道那些对你并不重要,印象中好象是一个关于售票系统的工程。很快,你找了你需要关注的重点:类的需求说明文档。你详细的看了一遍,感觉并不复杂,类名Ticket,有一个只读的int型公共的属性,名称是Amount,还有两个方法,一个是名称是Sell,功能是将Amount减去一,表示卖掉了一张票,当然,票可不能为负数,如果是的话,抛出一个异常说明原因。另一个是Add,它有一个int型的参数,功能是将这个参数的值加到Amount中去,可能是表示进票之类的事情吧,你不太关心,反正这个程序很简单,你掩饰住内心的狂喜,打开电脑,调出编辑器,开始准备写程序了。51Testing软件测试网,H$GZ tv0fnW
"喂,等等",项目经理不知道什么时候又转回来了,"我想知道你打算怎么进行单元测试,我最关心的是这个"。51Testing软件测试网+H`3Z9DMYc
"什么是单元测试?"你转过头一脸沮丧的看着失望的项目经理。51Testing软件测试网5fp }h*k8k1@s+XB

D6bh3w\y0--------------------------------------------------------------------------------51Testing软件测试网m$_.{ E%|N5z5DW

5AuWrbJ&Ex0什么是单元测试:
Tm*B xd4tl.G0在程序设计过程中会有许多种测试,单元只是其中的一种,单元测试并不能保证程序是完美无缺的,但是在所有的测试中,单元测试是第一个环节,也是最重要的一个环节。单元测试是一种由程序员自行测试的工作。简单点说,单元测试就是测试代码撰写者依据其所设想的方式执行是否产生了预期的结果。关于单元测试的重要性已经有许多文章做了很多深入的分析,这里就不再赘述。51Testing软件测试网 Z#G6qV"_@e Q0H
NUnit是一个为Net准备的自动化单元测试框架,它的作用就是帮助你方便的完成单元测试工作,同鼎鼎有名的JUnit一样,都是xUnit家族的成员。它的下载地址是:
http://www.nunit.org
MBm1{b hE0
n_(rC8T0Z0--------------------------------------------------------------------------------51Testing软件测试网0z'Q7E)T.gG\
51Testing软件测试网 T F6@_S q3?b{
测试先行:
W9q D+YWB0"什么?先写测试?"你一定非常惊讶,对!就是先来编写测试代码,按照极限编程(XP)的理论,写测试就是对软件进行设计的过程,它的重要性甚至超过了实际完成功能的代码。先将测试写完,然后再来完成代码,这样,所有的测试通过之日也就是程序完成之时。
p I#r(OH0首先,我们将NUnit提供的要nunit.framework.dll文件引入到工程中,并创建一个名为TicketTest的类:
9k0R Q'eJ3S:e-J R0[TestFixture]
2j(H9`d$NB_8M6`8[0        public class TicketTest51Testing软件测试网'@}#cJ|7y
        {51Testing软件测试网2_7G6nNA.t
                [Test]51Testing软件测试网QIoUJ |a!},G
                public void Add()
1Qjh B"[.Iq0                {51Testing软件测试网R4uiz2}}1p
                        Ticket ticket = new Ticket();
gwxN x5z0                        ticket.Add(100);51Testing软件测试网;m.E9\,@0Nme
                        Assertion.AssertEquals(100, ticket.Amount);51Testing软件测试网4apcO z
                }51Testing软件测试网2ejvK;a`
        }51Testing软件测试网XA^E,k[
51Testing软件测试网"q;zN\ S_ i)O!c
注意,其中的[TestFixture]和[Test]两个Attribute为NUnit所规定必须要添加的,这样,测试框架就可以知道哪些类或者方法需要进行测试。
/}-o*ep,UF6^0我们在Add方法中定义了一个ticket对象,并给他加了100张票,然后就可以使用:
8lB[:mhpI[~ g0Assertion.AssertEquals(100, ticket.Amount);51Testing软件测试网,pXZ3LY(I ?K
来测试ticket的Amount属性是否确实为100。51Testing软件测试网 W.h U,umyD9c6E/c*pb
接下来,我们再向TicketTest中添加一个测试Sell的方法:
s5\}P$FR0[Test]
^~4?quiYm0                public void Sell()
ZX7bh~6Ogd1r0                {
B&iWv'?"V%GH'{0                        Ticket ticket = new Ticket();
3n,}\'E%F9R/my|#S(o0                        ticket.Add(100);
5@LIA5P4ru;i&C%H0                        ticket.Sell();51Testing软件测试网x-M/L2U*K
                        ticket.Sell();51Testing软件测试网h4fI6`vKc4^1\7ea5pq
                        ticket.Sell();
%O `8n+OoZ Jz0                        Assertion.AssertEquals(97, ticket.Amount);51Testing软件测试网{v{A r Xo1@;N@
                }
f/q7d"g6]v051Testing软件测试网CYnUID!_ ig V4?
这里,我们先加了100张票之后就一口气卖掉了3张,然后看看我们是否还剩下97张票。51Testing软件测试网*En(tOh9Uy
好了,这两个方法的测试已经做完了,我们来看一下测试的结果,根据要求,我们写了如下代码:51Testing软件测试网g,j4Ow v
public class Ticket51Testing软件测试网T8du/d(bJm]'d
        {
Hsax?M'w-TY0                private int amount;51Testing软件测试网9{%V(g3h'h
                public int Amount
%](|8A2s!w@4GmYM0                {
8a _xlU+b0                        get
K*@ONI9|~ Unk0                        {
]9wx-Jt;I&RqB0                                return amount;51Testing软件测试网Y{2^ i9{dq.?
                        }
I;wP7c+MTK0                }51Testing软件测试网1f1{;AN| M?
51Testing软件测试网+D~1O2TjkvQ V
                public void Add(int num)51Testing软件测试网Av\!D2pt p&n
                {
'p"f3a)c\ ]D0                }51Testing软件测试网$E Ddr0j(UN
51Testing软件测试网z?p9sCr `
                public void Sell()51Testing软件测试网kvE0m)Zs7fQ,@
                {
D"c}/?i+Jw&T0                }51Testing软件测试网L p,jQp D @Z?+Q6A
}
,zF!rg,Ko*E:^0
J6D }C7X FXcI{0注意这段代码只是为了完成类的结构,方法的实现暂时先空着。然后将这段代码编译成一个dll动态连接库文件:UnitTest.dll。51Testing软件测试网S4C$IzG)@'C5r/rf
我们运行NUnit的图形测试工具,打开我们编译好的dll文件,点"Run"按纽,就可以看到如下画面:
(B|7q3T-v'C'Y6J}6y051Testing软件测试网0Z(sQF'g,J_
51Testing软件测试网pTp6QT c
很醒目红色,表示测试并没有成功,不过这个是在我们的预料之中的。51Testing软件测试网!^ ~%F~ly @)lo
接下来,我们向刚才的Ticket类中完成我们的Add方法实现代码:51Testing软件测试网A/I{#P J7^5\*~
public void Add(int num)
3|Iq{7CAQ0{
1dxC{,m*E f#K`1D0amount += num;
)w%EWu(Y;b OL1|zw0}
{j?TGP6?b0保存,重新编译。51Testing软件测试网sbLm0DGf"N7CV
切换到NUnit,再点Run,可以看到:51Testing软件测试网 ^T1\ i M,C3s"u@

}6`qd,m2_]051Testing软件测试网 eh.R7D)cG0hv
Add方法已经变成绿色了,再接着将Sell方法也完成:
.r^K7P2g*v0public void Sell()51Testing软件测试网q,\d\hsP E
{
C/W!W4\(Xrh `Z"QnaAa0amount -= 1;
!q"v en5T&vWb%_;u5j0}
7W;JG4R$|0再来测试,结果就变成:51Testing软件测试网7gO)_I6E*F?
51Testing软件测试网I}6bhX0`\

2qB HL?'v0a m3S6v0啊,总算变成美丽的绿色了,大家现在体会到环保的重要性了吧。 :)
!`;A5u+TWr4X/bk9L0那么可以交任务了吗?等等,别急,还有个异常没测试呢,如果我们的Amount小于0的话,就会产生异常,那么,异常怎么测试呢?请接着看。51Testing软件测试网)mLBY PGqAU!`
51Testing软件测试网f%?Mn0cS!R
--------------------------------------------------------------------------------
7_e y#O}.{N+K-i051Testing软件测试网-kmec:j'n5eR!P
测试异常:51Testing软件测试网JJIb$E?v] X9f4|W
还是跟上面一样,先写出测试代码:51Testing软件测试网6o}8LM,os)a;V
[Test]
f BF @ a aTD_0        [ExpectedException(typeof(Exception))]
U{Ud7` H2z$fU0        public void ExcpetionTesting()
D,a5`8o{ p@0        {
)N-d#@ U{#KHf0                Ticket ticket = new Ticket();
McrC1j y({2{E0                ticket.Add(3);51Testing软件测试网N9F zK&Yn
                ticket.Sell();
9W k V7g2b8E0                ticket.Sell();
NWw(P2~ @+k0                ticket.Sell();51Testing软件测试网v!G%\.P@9[2tMJ'd]A(D
                ticket.Sell();51Testing软件测试网V"\FGST7}
        }51Testing软件测试网n_K9}(__ H
51Testing软件测试网5BM W)uv#B
其中,[ExpectedException(typeof(Exception))]表示我们希望能捕获到发生的异常,如果没有捕获到异常,则表示测试失败。
J!e!h'dLK4LN"a0后面的代码很好理解,我们加了三张票,却卖了四张出去,这可不是炒股,以后没办法平仓的。 :)51Testing软件测试网A4v-O f:d
编译运行,我们看到以下的测试画面:
mK(yV'Q5m0n o0
tn wZ*p h$C9pl0
@2xH@C+o] ?0O0在Ticket类中,我们修改一下Sell方法,让它变成:
u*}b2y])t[2H0public void Sell()51Testing软件测试网 QsgGO`%W }
{
9|M%Z0h+K(zG6R0if(amount - 1 < 0)
NeB(U3HI ? Y0throw new Exception("Amount不能为0");51Testing软件测试网-IF k!k1m_Yx
amount -= 1;
6YQS'N#mC I6G:F0}
:mZ)@0Z x^[5k0编译,再测试,结果如下:
B$]:zq0FT0
j#M/q7PUh*QXjj0
:wW`dFRe^}0好了,到了这里就算完成我们的单元测试之旅了,大家对如何在C#中进行单元测试一定已经有了一个基本的认识。另外,NUnit并不是只针对C#,事实上,你可以在任何.Net语言中使用NUnit来测试你的单元,方法都一样。51Testing软件测试网fa)K(C6M*j&U6_

$i*CF0Q.B R$_%Q0--------------------------------------------------------------------------------
ULQ)o9M Z/p0
z"QO5S6h]0总结:
*q;|[.k%XL |0单元测试看上去虽然有点麻烦,但是它为程序员提供了一个安全的观点,让程序员对自己的程序更加有信心,在减少开发后期进行频繁Debug所耗费时间的同时也为应用软件提供了第一道安全防护网,因此,单元测试是提高开发效率和软件品质的一个重要的手段。
i%Ca'sQ7H&hd:N0利用UNint,我们可以在.Net编程过程中非常方便的进行单元测试,它图形化的界面和简单而强大的测试框架为我们提供了一个非常舒适而有趣的测试环境,能够让程序员觉得进行单元测试并不枯燥乏味,习惯后甚至还能成为一种乐趣。
0Xx2fk"r`0看完本文,如果你是引言中那个可怜的程序员的话,你现在就一定能轻松的面对你的项目经理,交上一份令人放心的代码答卷。

TAG: NUnit

 

评分:0

我来说两句

我的栏目

日历

« 2024-05-22  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

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

RSS订阅

Open Toolbar