<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)http://confach.cnblogs.com/archive/2005/06/20/177817.aspx -->
<HTML><HEAD id=Head><TITLE>NUnit详细使用方法 - Service Is Living - 博客园</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META id=metaKeywords content=NUnit详细使用方法 name=keywords><LINK id=MainCss
href="NUnit详细使用方法 - Service Is Living - 博客园.files/style.css" type=text/css
rel=stylesheet><LINK id=SecondaryCss
href="NUnit详细使用方法 - Service Is Living - 博客园.files/customcss.css" type=text/css
rel=stylesheet><LINK id=RSSLink title=RSS
href="http://www.cnblogs.com/confach/rss.aspx" type=application/rss+xml
rel=alternate>
<META content="MSHTML 6.00.2900.3199" name=GENERATOR></HEAD>
<BODY>
<FORM id=Form1 name=Form1 onsubmit="javascript:return WebForm_OnSubmit();"
action=177817.aspx method=post>
<DIV><INPUT id=__EVENTTARGET type=hidden name=__EVENTTARGET> <INPUT
id=__EVENTARGUMENT type=hidden name=__EVENTARGUMENT> <INPUT
id=" __VIEWSTATE" type=hidden name=__VIEWSTATE> </DIV>
<SCRIPT type=text/javascript>
<!--
var theForm = document.forms['Form1'];
if (!theForm) {
theForm = document.Form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
// -->
</SCRIPT>
<SCRIPT src="NUnit详细使用方法 - Service Is Living - 博客园.files/WebResource.axd"
type=text/javascript></SCRIPT>
<SCRIPT language=JavaScript>
function ctlent(evt,id)
{
if(evt.ctrlKey && evt.keyCode == 13)
{
try
{
TempSave(id);
}
catch(ex)
{
}
finally
{
__doPostBack('AjaxHolder$PostComment$btnSubmit','')
}
}
}</SCRIPT>
<SCRIPT language=JavaScript>function SetReplyAuhor(author){document.getElementById('AjaxHolder_PostComment_tbComment').value+="@"+author+"\n";document.getElementById('AjaxHolder_PostComment_tbComment').focus();return false}</SCRIPT>
<SCRIPT src="NUnit详细使用方法 - Service Is Living - 博客园.files/ScriptResource.axd"
type=text/javascript></SCRIPT>
<SCRIPT
src="G:\NUnit详细使用方法 - Service Is Living - 博客园.files\ScriptResource(1).axd"
type=text/javascript></SCRIPT>
<SCRIPT
src="G:\NUnit详细使用方法 - Service Is Living - 博客园.files\ScriptResource(2).axd"
type=text/javascript></SCRIPT>
<SCRIPT src="NUnit详细使用方法 - Service Is Living - 博客园.files/js"
type=text/javascript></SCRIPT>
<SCRIPT type=text/javascript>
<!--
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;
return true;
}
// -->
</SCRIPT>
<H1><A class=headermaintitle id=Header1_HeaderTitle
href="http://www.cnblogs.com/confach/">Service Is Living</A></H1>
<P id=tagline>A Thousand-Mile Journey Begins With The First Step And Can Only Be
Taken One Step At a Time. <BR>一步一个脚印,踏踏实实!</P>
<DIV id=main>
<SCRIPT type=text/javascript>
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]>
</SCRIPT>
<DIV class=post>
<H2><A id=AjaxHolder_ctl01_TitleUrl
href="http://www.cnblogs.com/confach/archive/2005/06/20/177817.html">NUnit详细使用方法</A>
</H2>
<DIV class=postText>
<DIV align=center><STRONG>NUnit2.0详细使用方法 </STRONG></DIV>
<DIV><SPAN
style="FONT-WEIGHT: bold; FONT-STYLE: italic">注:NUnit中文文档可以参看我的另一个站点:</SPAN><A
style="FONT-WEIGHT: bold; FONT-STYLE: italic" href="http://www.36sign.com/nunit"
target=_blank>http://www.36sign.com/nunit</A><BR><BR>前一段时间,有人问我在.NET里如何进行TDD开发.这个问题促使我想对NUnit做一个详细的介绍.因为我们大家都知道NUnit是在.NET进行TDD的利器.<BR>如果你已经知道很多关于NUnit的应用,请指出我的不对之处和提出一些建议,使本文更加完善.如果你对NUnit还不是很了解的话,我建议你还是阅读一下.</DIV>
<DIV>本文分为以下部分:</DIV>
<H2>1. TDD的简介 </H2>
<DIV>首先什么是TDD呢?Kent Beck在他的<<测试驱动开发 >>(Addison-Wesley
Professional,2003)一书中,使用下面2个原则来定义TDD: </DIV>
<DIV>·除非你有一个失败的自动测试,永远不要写一单行代码. </DIV>
<DIV>·阻止重复 </DIV>
<DIV>我想第一个原则是显而易见的.在没有失败的自动测试下就不要写代码.因为测试是嵌入在代码必须满足的需求中.如果没有需求,就没有必要实现任何东西.所以这个原则阻止我们去实现那些没有测试和在解决方案中不需要的功能.
</DIV>
<DIV>第二个原则说明了在一个程序中,不应该包含重复的代码.如果代码重复,我想这就是不好的软件设计的象征.随着时间的流逝,它会对程序造成不一致的问题,并且使代码变非常混乱
,因为我们时常不会记得重复代码的位置.如果发现代码重复,我想我们应该立即删除代码重复.其实这就涉及到重构了.在这里我就不多讲了. </DIV>
<DIV>一般来说,测试分为2种类型,一是程序员自己的测试,另外一种是客户的测试.关于客户测试,我推荐一个FIT的框架,非常不错。在这里,我们讲的TDD就是程序员测试.那么什么是程序员测试呢?我认为就是我们常说的单元测试.既然是单元测试,在.NET里势必会用到某些工具,目前最著名恐怕就是我即将介绍的NUnit了,
</DIV>
<H2>2.NUnit的介绍 </H2>
<DIV>NUnit是一个单元测试框架,专门针对于.NET来写的.其实在前面有JUnit(Java),CPPUnit(C++),他们都是xUnit的一员.最初,它是从JUnit而来.现在的版本是2.2.接下来我所用的都是基于这个版本.</DIV>
<DIV>NUnit最初是由James W. Newkirk, Alexei A. Vorontsov 和Philip A. Craig,
后来开发团队逐渐庞大起来.在开发过程中, Kent Beck 和Erich
Gamma2位牛人也提供了许多帮助.看来对于NUnit还真是下了一番力气了.J</DIV>
<DIV>NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等.</DIV>
<DIV>最重要的一点是它适合于所有.NET语言.</DIV>
<DIV>如果你还没有下载,可以到http://www.nunit.org/去下载.</DIV>
<H3>2.1 NUnit的介绍 </H3>
<DIV> Ok,下面正式讲解NUnit.在讲解之前,看看几张图片:</DIV>
<DIV> <IMG
src="NUnit详细使用方法 - Service Is Living - 博客园.files/NUnit.1.jpg" border=0> </DIV>
<DIV>图1 NUnit运行的效果<BR></DIV>
<DIV><IMG src="NUnit详细使用方法 - Service Is Living - 博客园.files/NUnit.2.jpg"
border=0><BR>
图2 NUnit运行的另外一个效果</DIV>
<DIV> 从中我们可以非常容易发现,右边是个状态条,图1是红色的,图2是绿色的.为什么会这样呢?因为如果所有测试案例运行成功,就为绿色,反之如果有一个不成功,则为红色,但也有黄色的.左面的工作域内则是我们写的每一个单元测试.</DIV>
<DIV>通过上面的图片,我想你对NUnit有个总的了解了.</DIV>
<DIV>接下来还是分为2个部分,一是NUnit的布局,另外一部分就是它的核心概念.</DIV>
<DIV>首�