我的地盘我做主! 博客:http://tester2test.cnblogs.com/   msn:win_soft@163.com

使用NUnit在.Net编程中进行单元测试

上一篇 / 下一篇  2007-06-07 14:30:40 / 个人分类:其他

本文通过一个详实的例子,详细介绍了如何在C#中利用NUnit单元测试框架进行应用程序类的单元测试工作。
;[ s.L*@ot0
fO| K*b d8y q3h]0
6~7U9HGN;R0引言:
v?c3XRa0举一个可能会发生在你身边的事件将更能贴近实际,幸好我们现在就有一件在程序员看来非常普通的任务:51Testing软件测试网| _PQ6f/s%X
你今天第一天上班,你的项目经理拿给你一叠不算厚的文档,告诉你今天的任务是按照文档中的要求编写一个.Net类,可能因为任务并不复杂,所以他看上去非常的随意。
xlw]9X o:r[E\y0今天能否很好的完成任务对你来说非常特殊,你拿过来后快速略过了前面大段的项目介绍,因为你知道那些对你并不重要,印象中好象是一个关于售票系统的工程。很快,你找了你需要关注的重点:类的需求说明文档。你详细的看了一遍,感觉并不复杂,类名Ticket,有一个只读的int型公共的属性,名称是Amount,还有两个方法,一个是名称是Sell,功能是将Amount减去一,表示卖掉了一张票,当然,票可不能为负数,如果是的话,抛出一个异常说明原因。另一个是Add,它有一个int型的参数,功能是将这个参数的值加到Amount中去,可能是表示进票之类的事情吧,你不太关心,反正这个程序很简单,你掩饰住内心的狂喜,打开电脑,调出编辑器,开始准备写程序了。51Testing软件测试网%V I6J:P RW
"喂,等等",项目经理不知道什么时候又转回来了,"我想知道你打算怎么进行单元测试,我最关心的是这个"。51Testing软件测试网~,Hp"M:]
"什么是单元测试?"你转过头一脸沮丧的看着失望的项目经理。51Testing软件测试网;C$d iWrz
51Testing软件测试网l rHb;](kmf5Ia%g
--------------------------------------------------------------------------------
J&U'A(M"}3\%R6P+m051Testing软件测试网R gZ4_W
什么是单元测试:51Testing软件测试网 `Q&N3R wtV3v
在程序设计过程中会有许多种测试,单元只是其中的一种,单元测试并不能保证程序是完美无缺的,但是在所有的测试中,单元测试是第一个环节,也是最重要的一个环节。单元测试是一种由程序员自行测试的工作。简单点说,单元测试就是测试代码撰写者依据其所设想的方式执行是否产生了预期的结果。关于单元测试的重要性已经有许多文章做了很多深入的分析,这里就不再赘述。
Op"iHl2U!c~0NUnit是一个为Net准备的自动化单元测试框架,它的作用就是帮助你方便的完成单元测试工作,同鼎鼎有名的JUnit一样,都是xUnit家族的成员。它的下载地址是:http://www.nunit.org
,L-^Z2nZvet051Testing软件测试网 q3QZu ?*?y
--------------------------------------------------------------------------------
%y#VH+J)uVI0
'^mP2j2zY ^0测试先行:51Testing软件测试网P0F K-}/^Ly
"什么?先写测试?"你一定非常惊讶,对!就是先来编写测试代码,按照极限编程(XP)的理论,写测试就是对软件进行设计的过程,它的重要性甚至超过了实际完成功能的代码。先将测试写完,然后再来完成代码,这样,所有的测试通过之日也就是程序完成之时。
'Q:n4Or;K"o&so5@@P0首先,我们将NUnit提供的要nunit.framework.dll文件引入到工程中,并创建一个名为TicketTest的类:51Testing软件测试网P5Bum#E gj!f!zrj]
[TestFixture]51Testing软件测试网p/J-a;A8J2M-J`gE}
        public class TicketTest
rM{g g0        {
$A(g4CK1O/~0                [Test]
sI~,B;gs+D N|0                public void Add()51Testing软件测试网(fF0|WT%UA
                {
;j]+CCQ0                        Ticket ticket = new Ticket();51Testing软件测试网3u'D k q)U uY a:K*E\
                        ticket.Add(100);51Testing软件测试网P^/@o.dp{S
                        Assertion.AssertEquals(100, ticket.Amount);51Testing软件测试网.?!{E0w Loc,X
                }51Testing软件测试网;U(l.s9mC J*Y-g
        }51Testing软件测试网@OH:v:|b+e

} ?!YA w2CR gn0注意,其中的[TestFixture]和[Test]两个Attribute为NUnit所规定必须要添加的,这样,测试框架就可以知道哪些类或者方法需要进行测试。51Testing软件测试网'b:P2v\2CH Sy
我们在Add方法中定义了一个ticket对象,并给他加了100张票,然后就可以使用:
i#L7U VQB0Assertion.AssertEquals(100, ticket.Amount);51Testing软件测试网5t:d%\$h6|\ |
来测试ticket的Amount属性是否确实为100。51Testing软件测试网 V8D5s+S;^b'o
接下来,我们再向TicketTest中添加一个测试Sell的方法:51Testing软件测试网%wD%~h8U%a!D`(k
[Test]51Testing软件测试网-wz5W;_/[ WlG
                public void Sell()51Testing软件测试网e2O2u|wOA
                {
ip\ S{:S$Gv0                        Ticket ticket = new Ticket();
Y3E\ s#L6jSK1M5t0                        ticket.Add(100);
%t"@;H8xli,m"x K0                        ticket.Sell();
f;N7R`$wR9st[0                        ticket.Sell();
)D&N{"{J P [9w0                        ticket.Sell();
1GoHs_-|0                        Assertion.AssertEquals(97, ticket.Amount);51Testing软件测试网A B!{+O#_*HM
                }
2uu#f%W1S$N051Testing软件测试网JA"gH/a FFf
这里,我们先加了100张票之后就一口气卖掉了3张,然后看看我们是否还剩下97张票。
o+`D!}^u0好了,这两个方法的测试已经做完了,我们来看一下测试的结果,根据要求,我们写了如下代码:51Testing软件测试网Z(r`Fa Y
public class Ticket51Testing软件测试网fw m,a9z.bu8X
        {
X4j Tp2S0                private int amount;51Testing软件测试网,jW ? HVa!w
                public int Amount51Testing软件测试网e m$g)v Uz C*[P
                {
8w n6nmc0                        get51Testing软件测试网:[m3f$a|F
                        {51Testing软件测试网9b2X'K {)Se"Hdf~
                                return amount;51Testing软件测试网-P7lS5f Bl}
                        }51Testing软件测试网 \s.f wc4c@l
                }
1Y3c!_;@'C0
!E(Bktqa;NF!R*P~0                public void Add(int num)
PjE$zl0                {
G9F(U{6c.Y^T0                }51Testing软件测试网B6z8S:zdC

$]5kmHV5?0                public void Sell()51Testing软件测试网(tIh y+r1V&`GG/L
                {51Testing软件测试网R8d$^F.iMV&m
                }
t9?Y(R4\'}/X m Q0}
oBV(C(lMsBB051Testing软件测试网 th6a"Z`@
注意这段代码只是为了完成类的结构,方法的实现暂时先空着。然后将这段代码编译成一个dll动态连接库文件:UnitTest.dll。51Testing软件测试网6pc9ezAr0A.irB
我们运行NUnit的图形测试工具,打开我们编译好的dll文件,点"Run"按纽,就可以看到如下画面:51Testing软件测试网;\_%I'bLF)W F
51Testing软件测试网'u&fU*AG@j)w.o N;M0eZ

vN k2gry*l/j+NV0D1S0很醒目红色,表示测试并没有成功,不过这个是在我们的预料之中的。
+f4F\*XS8K6z~0接下来,我们向刚才的Ticket类中完成我们的Add方法实现代码:
(gThm&b0public void Add(int num)
'M8|]#oz8]G+r0{
l@n4@:_V[L0amount += num;
l.}.S J&P^1YO0}
c[0v.H9u/h`0保存,重新编译。51Testing软件测试网!Jr0u:},V{4k)@
切换到NUnit,再点Run,可以看到:51Testing软件测试网3f\Jv#MIJ0F N

jO3},p-U051Testing软件测试网3n-P5p.YnJ0b9H
Add方法已经变成绿色了,再接着将Sell方法也完成:
2Y9g a6B4@0~;qe0public void Sell()
HUoK#F"j:\6Xd:t/VH0{
d`F5MBZ.iN0amount -= 1;51Testing软件测试网:l(F P1J.nh Lm`
}
E2SDq T4V0再来测试,结果就变成:51Testing软件测试网DW(E-Jo A il
51Testing软件测试网*q&KI-G9D S0}bY)B
51Testing软件测试网 N E:g_MTq;O
啊,总算变成美丽的绿色了,大家现在体会到环保的重要性了吧。 :)51Testing软件测试网F}:w]j
那么可以交任务了吗?等等,别急,还有个异常没测试呢,如果我们的Amount小于0的话,就会产生异常,那么,异常怎么测试呢?请接着看。
vJ)@bmQ0
q*iSm_8V ?6g x0--------------------------------------------------------------------------------
5m6y([hQ`"z0
|;w(lH1m0测试异常:51Testing软件测试网'{8R"_Q2U'El
还是跟上面一样,先写出测试代码:
c!l-r.DN Vy t7k0[Test]51Testing软件测试网)@+h*jF#[M;]}
        [ExpectedException(typeof(Exception))]51Testing软件测试网!L W2\0WMoM
        public void ExcpetionTesting()
sP'YNeeM9^0        {
~z.UD r9t2L0                Ticket ticket = new Ticket();
`%_6x:eQM0                ticket.Add(3);
;HA&r.W7a~ d0                ticket.Sell();
8kdtJ(M.e0                ticket.Sell();51Testing软件测试网Ss_s4V4Yg X
                ticket.Sell();
| O/v2w,W$y9W"X0                ticket.Sell();
oV7hz s&oRd0        }
*]Y;D6R!^e3}0
hM rwf)]c0其中,[ExpectedException(typeof(Exception))]表示我们希望能捕获到发生的异常,如果没有捕获到异常,则表示测试失败。
-t6Q }%s5];|BUI0后面的代码很好理解,我们加了三张票,却卖了四张出去,这可不是炒股,以后没办法平仓的。 :)
%U{,M*rie4m8jm0编译运行,我们看到以下的测试画面:
E/XsI\3`z&kL051Testing软件测试网P:\!v1{oG)ACG]
51Testing软件测试网W,Ag3Rv&pd
在Ticket类中,我们修改一下Sell方法,让它变成:51Testing软件测试网#D)a/\m OH"}(]
public void Sell()51Testing软件测试网FM:r7Z^
{51Testing软件测试网g$J}^*tyr(n0L
if(amount - 1 < 0)51Testing软件测试网 ^M(JW-e0Im
throw new Exception("Amount不能为0");
$]9T;N;NhOQC-M0amount -= 1;
NJKy;F0}
:N|z%V4fAj0编译,再测试,结果如下:51Testing软件测试网:PI;Y,ZIJV

B+C8j:Eht Jtv051Testing软件测试网'o+f"[&Wsh4OY
好了,到了这里就算完成我们的单元测试之旅了,大家对如何在C#中进行单元测试一定已经有了一个基本的认识。另外,NUnit并不是只针对C#,事实上,你可以在任何.Net语言中使用NUnit来测试你的单元,方法都一样。
\!]gm$b0
t V+Bd|C \3Te;D0--------------------------------------------------------------------------------51Testing软件测试网b \ccEgZS
51Testing软件测试网 @`*S%RF+Tv4d
总结:
\;qo lY0单元测试看上去虽然有点麻烦,但是它为程序员提供了一个安全的观点,让程序员对自己的程序更加有信心,在减少开发后期进行频繁Debug所耗费时间的同时也为应用软件提供了第一道安全防护网,因此,单元测试是提高开发效率和软件品质的一个重要的手段。
YY!v uy:m\~MT0利用UNint,我们可以在.Net编程过程中非常方便的进行单元测试,它图形化的界面和简单而强大的测试框架为我们提供了一个非常舒适而有趣的测试环境,能够让程序员觉得进行单元测试并不枯燥乏味,习惯后甚至还能成为一种乐趣。
-Smzm9Q ^Y/u0看完本文,如果你是引言中那个可怜的程序员的话,你现在就一定能轻松的面对你的项目经理,交上一份令人放心的代码答卷。
51Testing软件测试网o{)xL$\/g
51Testing软件测试网$Oz0Q+}&M6A(wB
测试者家园 2006-06-14 16:22 发表评论
51Testing软件测试网KS5UFM3x3YQ s uf
51Testing软件测试网(v@MPLk.r7C,l
Link URL: http://www.cnblogs.com/tester2test/archive/2006/06/14/425859.html

TAG:

细微探世界 引用 删除 573702881   /   2008-05-06 21:33:06
哈哈!!高手先生好!看来你对NUnit测试方面的专家。下面程序有什么BUG?怎么写测试类?
namespace MyStack
{
    public class MyStack
    {
        private int nextIndex;
        private string[] elements(元素);
        public static void Main(string[] args)
        {
        }
        public MyStack()
        {
            elements = new string[100];
            nextIndex = 0;
        }
        public void Push(string element)
        {
            elements[nextIndex++] = element;
        }
        public string Pop()
        {
            return elements[--nextIndex];
        }
        public void Delete(int n)
        {
            nextIndex = nextIndex - n;
        }
        public string Top()
        {
            return elements[nextIndex-1];
        }
        public int Size()
        {
            return this.nextIndex;
        }       }
 

评分:0

我来说两句

日历

« 2023-04-30  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 256159
  • 日志数: 689
  • 建立时间: 2006-12-05
  • 更新时间: 2009-04-15

RSS订阅

Open Toolbar