.NET开源项目介绍及资源推荐:单元测试

说到单元测试,大家首先会想到NUnit,但对于NUnit来说还存在着一些不足,比如说它不能够与VS.NET IDE集成、扩展能力比较差等,除此之外我们还需要一些自动化的测试工具,本文将简单介绍一下如下几种单元测试工具以及推荐一些学习资源。

1NUnit

2TestDriven.Net

3NUnitForms

4NUnitAsp

 

一.NUnit

提起大名鼎鼎的NUnit,我想没有几个不知道吧?NUnit是一个专门针对于.NET的单元测试框架。在这之前有针对JavaJUnit,针对C++CPPUnit,它们都是属于xUnit家族。 NUnitxUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等,最重要的一点是它适合于所有.NET语言。

编写一段简单的单元测试代码:

[TestFixture]
public class TestDatabase
{   
    [Test]
    
public void TestWithDebugger()
    
{
        ClassA ca 
= new ClassA();
        
int expected = 3;
        
int result = ca.GetResult();
        Assert.AreEqual(expected,result);
    }

}

NUnit的使用非常简单,运行后如下图所示:

NUnit虽然在使用上非常简单,赢得了一部分用户,甚至于微软在企业库的源码中也提供了使用NUnit测试的版本,但是NUnit让我最不爽的地方是没有提供Visual Studio IDE插件,这样如果做单元测试,会发现自己每天忙于奔波于IDENUnit GUI之间,不停的在切换窗口;还有一点NUnit虽然跟JUnit是兄弟,但是它的威望和能力相较Junit就差远了,尤其是扩展能力,后面我会介绍到一个NUnitWinForm插件。

官方主页:http://www.nunit.org/

学习资源

1NUnit官方文档

2.园子里LIVENUnit详细使用方法

3Aero实践单元测试(3)-Using NUnit

个人认为,看以上两篇中文资料足以学会NUnit的使用,它的难点在于测试用例的编写上,而不是工具本身的使用。


二.TestDriven.Net

TestDriven.Net列在开源项目介绍里面其实有些不太合适,因为它现在已经是一种商业化的工具,只有个人版可以免费下载使用,个人认为在开发中个人版的功能已经足够了,之所以我要把它放在这里介绍,是因为它太优秀了。前面说的NUnit,虽然使用非常简单,但是它不能与我们的.NET开发环境集成起来,而TestDriven.Net就是这样一款以插件的形式集成在Visual Studio中的单元测试工具,它的前身是NUnitAddIn,由Jamie Cansdale大师开发,一开始作者只是想做一个NUnit插件集成到Visual Studio中,经过多次版本更新,NUnitAddIn20049月底更名为TestDriven.NET,并在当年的12月初发布了它的第一个Release版本,即TestDriven.NET 1.0。在今年的10月底,终于迎来了TestDriven.NET 2.0版本的发布,最新的2.0版本集成了.NET ReflectorNConverNConverExplorerTypeMock.NET等,功能更加强大,我们还是使用前面的例子:

[TestFixture]
public class TestDatabase
{   
    [Test]
    
public void TestWithDebugger()
    
{
        ClassA ca 
= new ClassA();
        
int expected = 3;
        
int result = ca.GetResult();
        Assert.AreEqual(expected,result);
    }

}

它所有的操作都是通过IDE中的右键菜单完成,如下图所示:

由于跟IDE的集成,可以使我们很快的定位到出错的代码行:

官方主页:http://www.testdriven.net/

学习资源

由于TestDriven.Net的使用非常简单,所以目前基本没有什么中文文章介绍,大家可以参考一下官方网站上的QuickStart以及我在0612月份《程序员》杂志上写的一篇关于TestDriven.Net的文章。

 

三.NunitForms

NUnitForms从命名上看,就知道它跟NUnit有关,没错,它是NUnit的一个WinFrom的扩展。它为Windows Forms应用程序提供单元测试和压力测试,可以非常容易的用它为你的Windows Forms类进行自动化测试,它提供了一个Recorder Application,来记录你的操作。我们编写类似于如下代码片断的测试代码:

ButtonTester button = new ButtonTester("buttonName""formName"); 

ControlTester textBox 
= new ControlTester("nameOfSomeTextBox");

Assertion.AssertEquals(
"defaultText", textBox["Text"];

textBox[
"text"= "newText";

或者类似于这样的代码进行操作记录:

//records button.Click() 
public void Click(object sender, EventArgs args)
{
    listener.FireEvent(TesterType, sender, 
"Click");
}


//records: comboBox.Enter("text"); 
public void TextChanged(object sender, System.EventArgs e)
{
    listener.FireEvent(TesterType, sender, 
"Enter", ((ComboBox)sender).Text);
}


//records: comboBox.Select(3); //text of item 3 
public void SelectedIndexChanged(object sender, System.EventArgs e)
{
    EventAction action 
= new EventAction("Select", ((ComboBox)sender).SelectedIndex);
    action.Comment 
= ((ComboBox)sender).Text;
    listener.FireEvent(TesterType, sender, action);
}

对于NUnitForms,它还有一个兄弟工具叫NUnitASP

官方主页:http://nunitforms.sourceforge.net/

学习资源

对于NUnitForms,仍然是没有发现有好的中文资源,大家可以参考官方文档

 

四.NUnitAsp

NUnitAsp可以说是NUnitForms的兄弟,它也是一个NUnit的扩展,用来自动测试ASP.NET页面。虽然NunitAsp可以完成一些ASP.NET页面的自动化测试工作,但是在编写测试用例的时候,如果界面上的元素比较多,编写起来会非常的麻烦,这也是为什么NunitAsp一直处于大紫不红的原因。它可以编写如下代码片断的测试代码:

public void TestLayout()
{
    TextBoxTester name 
= new TextBoxTester("name", CurrentWebForm);
    TextBoxTester comments 
= new TextBoxTester("comments", CurrentWebForm);
    ButtonTester save 
= new ButtonTester("save", CurrentWebForm);
    DataGridTester book 
= new DataGridTester("book", CurrentWebForm);

    Browser.GetPage(
"http://localhost/GuestBook/GuestBook.aspx");

    AssertVisibility(name, 
true);
    AssertVisibility(comments, 
true);
    AssertVisibility(save, 
true);
    AssertVisibility(book, 
false);
}


public void TestSave()
{
    TextBoxTester name 
= new TextBoxTester("name", CurrentWebForm);
    TextBoxTester comments 
= new TextBoxTester("comments", CurrentWebForm);
    ButtonTester save 
= new ButtonTester("save", CurrentWebForm);
    DataGridTester book 
= new DataGridTester("book", CurrentWebForm);

    Browser.GetPage(
"http://localhost/GuestBook/GuestBook.aspx");

    name.Text 
= "Dr. Seuss";
    comments.Text 
= "One Guest, Two Guest! Guest Book, Best Book!";
    save.Click();
}

官方主页:http://nunitasp.sourceforge.net/index.html

学习资源

跟自己的兄弟NUnitForms一样,仍然没有好的中文文档,有兴趣的朋友可以参考‘NUnitAsp官方文档,相对来说还是比较全的,有很多的教程。

 

总结

对于单元测试工具,就简单的介绍这么多,我个人还是推荐使用TestDriven.Net的个人版,至于后面两个NUnit的扩展,大家可以参考一下,在实际开发中用它们来测试会很麻烦,至少我目前不敢去做这个尝试。还有一个非常值得推荐的单元测试工具Mbunit,有兴趣的朋友可以关注一下,我对它了解并不多。

本来想在文章中再介绍一下开源的Mock框架的,感觉太多了,只好单独放一篇文章来介绍了。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2006-12-05 23:41 TerryLee 阅读(8582) 评论(57)  编辑 收藏 所属分类: TDD & ReflectorOpen Source

  回复  引用  查看    
#1楼 2006-12-06 00:05 | Dflying Chen      
这个系列不错啊,呵呵
  回复  引用  查看    
#2楼 2006-12-06 00:07 | Dflying Chen      
不小心坐了个沙发:)
  回复  引用  查看    
#3楼 2006-12-06 00:08 | apan      
请问,mobile开发的测试软件有什么呢?去年做mobile时,完全是手工写测试用例,有些测试简直把我逼疯了,ppc速度慢,做一个用例用花好些时间。一出问题,重复做,太可怕了。
  回复  引用    
#4楼 2006-12-06 00:12 | wemissworld[匿名] [未注册用户]
谢谢,正要找一个单元测试工具呢,TerryLee就写了这篇很全面的文章。
  回复  引用  查看    
#5楼 [楼主]2006-12-06 00:35 | TerryLee      
@Dflying Chen
谢谢支持:)
  回复  引用  查看    
#6楼 [楼主]2006-12-06 00:36 | TerryLee      
@apan
对mobile开发不了解哦:)
  回复  引用  查看    
#7楼 [楼主]2006-12-06 00:37 | TerryLee      
@wemissworld[匿名]
呵呵,对大家有所帮助就好啊:)
  回复  引用    
#8楼 2006-12-06 01:01 | unicorn[匿名] [未注册用户]
頁面測試,可以關注一下 watiN,他可控制到 dialog/frame/js的alert/confirm 的測試
http://watin.sourceforge.net/

單元測試的部份,我們是用 NUnitLite
http://www.codeplex.com/NUnitLite
功能少nunit很多-_-,但他可以測試 web site project 裏app_code裏的cs
符合工作的需求,也可參考看看
  回复  引用  查看    
#9楼 2006-12-06 06:56 | LIVE      
@apan
对于Mobile的单元测试工具,恐怕很难找,因为netcf对于反射支持有限,而像NUnit这样的工具也用到了反射。最典型的例子就是NDoc,这个对netcf有的时候就爱莫能助了。
  回复  引用  查看    
#10楼 [楼主]2006-12-06 08:30 | TerryLee      
@unicorn[匿名]
谢谢推荐
  回复  引用  查看    
#11楼 [楼主]2006-12-06 08:31 | TerryLee      
@LIVE
:)
  回复  引用  查看    
#12楼 2006-12-06 09:25 | 让风吹--笨牛      
文章不错...
支持.
  回复  引用  查看    
#13楼 2006-12-06 10:01 | 阿武      
怎么没有介绍一下VS2005自带的单元测试呢?
  回复  引用    
#14楼 2006-12-06 10:26 | RDM [未注册用户]
ReSharper UnitRun
"is a free add-in for Microsoft Visual Studio 2005 that allows you to automatically run and profile unit tests. This user-friendly tool detects test fixtures of the supported unit testing frameworks and lets you run or profile them right from the code editor or from Visual Studio's Solution Explorer. "
免费但不是开源的...
http://www.jetbrains.com/unitrun/
  回复  引用  查看    
#15楼 2006-12-06 10:27 | hj821111      
@TerryLee

谢谢,正在学习相关知识..
  回复  引用    
#16楼 2006-12-06 10:30 | GASSNAKE [未注册用户]
TestDriven.Net测试的时候好像不需要加[TEST]标记的
还有就是它和NUnit一样,需要在BIN目录下加上一个config文件(项目名称.dll.config)
  回复  引用  查看    
#17楼 2006-12-06 10:34 | apan      
@LIVE
谢谢您!
  回复  引用  查看    
#18楼 [楼主]2006-12-06 13:04 | TerryLee      
@让风吹--笨牛
谢谢……
  回复  引用  查看    
#19楼 [楼主]2006-12-06 13:04 | TerryLee      
@阿武
主要是介绍.NET开源项目!
  回复  引用  查看    
#20楼 [楼主]2006-12-06 13:06 | TerryLee      
@RDM
谢谢推荐!
  回复  引用  查看    
#21楼 [楼主]2006-12-06 13:06 | TerryLee      
@hj821111
:)
  回复  引用  查看    
#22楼 [楼主]2006-12-06 13:07 | TerryLee      
@GASSNAKE
TestDriven.Net仍然是需要编写测试代码的,也需要加需要加[TEST]标记!
  回复  引用  查看    
#23楼 2006-12-06 15:12 | henry      
用了一下TestDriven.Net
感觉不错,还可以输出代码内部输出的debug信息和调试很方便。
试了一下好象是不需要添加Test标记。
  回复  引用    
#24楼 2006-12-06 16:16 | eee [未注册用户]
VS2007 将支持Mobile 系统的 unit test, 请大家关注。
另外, VS2005 database professsional 版本已经发布,支持SQL的单元测试 ,请大家试用。
  回复  引用  查看    
#25楼 [楼主]2006-12-06 18:09 | TerryLee      
@henry
不添加Test标记是一种Ad-Hoc 测试
  回复  引用  查看    
#26楼 [楼主]2006-12-06 18:10 | TerryLee      
@eee
:)
  回复  引用  查看    
#27楼 2006-12-06 20:24 | Bily      
TeamSuite自带的UnitTest有人用过吗,应该是微软用来代替NUnit的.
  回复  引用    
#28楼 2006-12-07 17:28 | datocc [未注册用户]
这里有很多测试工具介绍的
http://www.code-hot.com/Source.aspx?tagID=3,58&sort=
  回复  引用  查看    
#29楼 2006-12-07 22:40 | KiddLee      
原来有这么多工具
  回复  引用    
#30楼 2006-12-09 12:47 | miles [未注册用户]
非常喜欢您这个系列的文章,能不能写一篇介绍模板引擎的文章?
  回复  引用  查看    
#31楼 [楼主]2006-12-11 23:25 | TerryLee      
@Bily
肯定有很多人用,NUnit还是有它的优势的,至少是免费的
  回复  引用  查看    
#32楼 [楼主]2006-12-11 23:25 | TerryLee      
@datocc
:)
  回复  引用  查看    
#33楼 [楼主]2006-12-11 23:26 | TerryLee      
@KiddLee
呵呵,还有好多啊,有些没接触过
  回复  引用  查看    
#34楼 [楼主]2006-12-11 23:26 | TerryLee      
@miles
看情况吧,最近很忙的
  回复  引用    
#35楼 2006-12-12 16:46 | o5 [未注册用户]
我怎么NUnit GUI运行不起来。。怎么弄
  回复  引用  查看    
#36楼 [楼主]2006-12-13 20:23 | TerryLee      
@o5
报什么错误吗?

下个最新版本看看
  回复  引用    
#37楼 2006-12-22 16:22 | Marco [未注册用户]
目前正在使用Team Suite中的NUnit框架,但從使用方便性的角度來看,比起TestDriven.NET真的是不可同日而語,但它有一個極大的優勢就是與Team Build做了不錯的結合。且若你有每天做Team Build時,它可以自動幫你記錄每天自動執行失敗與成功的UnitTest數量以及Code Covery Analysis。但因為還不是很了解Team Build這些功能,所以不是很確定TestDriven.NET是否可以與Team Suite做好的結合(應該是可以,但需要寫一些Script,但是否可以記錄執行結果就很難說了)。
  回复  引用  查看    
#38楼 [楼主]2006-12-23 16:21 | TerryLee      
@Marco
TestDriven.NET与Team Suite结合应该是没问题的
  回复  引用    
#39楼 2006-12-23 18:10 | Marco [未注册用户]
仔细想想,TestDriven.NET我们会用在个人开发上,而Daily Build我们会在Build Server上执行,照理讲是不冲突的。除非我们在NUnit Framework下写的Test Code,无法被.NET Framework中的Unit Test Framework辨识。在这个前提下,建议使用TestDriven.NET,用起来真的比较方便。(PS.写的不对的地方请帮忙指正。)
  回复  引用  查看    
#40楼 [楼主]2006-12-24 15:53 | TerryLee      
@Marco
:)
  回复  引用    
#41楼 2007-05-04 01:00 | togzegoh [未注册用户]
<a href="http://dwnsmcss.com">qwovnbxb</a> qeewaetv http://loacnrcm.com ckjnefms zwwqtxek [URL=http://vhfjohwr.com]vwjvoghu[/URL]
  回复  引用    
#42楼 2007-05-04 01:01 | linbkeva [未注册用户]
[URL=http://rergikso.com]nayvostp[/URL] lvjfmprg http://aqvajyoe.com iubwyyzs zdwulixw <a href="http://rssjvjdl.com">obrybsxs</a>
  回复  引用    
#43楼 2007-05-04 15:15 | uehbpgeq [未注册用户]
lgfpmghs http://bugwoqpg.com khocabkr iuljmadl <a href="http://ikivcnso.com">hbppidtb</a> [URL=http://wztyjpbn.com]ksarlwur[/URL]
  回复  引用    
#44楼 2007-05-04 15:24 | yxldjqnp [未注册用户]
[URL=http://yjvvjbdq.com]vxsxmahb[/URL] ngeavrfs http://hvlhakyp.com zcbsxbvb dwvrobtf <a href="http://ugnqogzf.com">gizbvxjf</a>
  回复  引用    
#45楼 2007-05-04 15:26 | xrssvgxf [未注册用户]
[URL=http://zncrocyy.com]yoleckts[/URL] hushegqv http://ljkyiswj.com zcbipyuv qpnoloso <a href="http://ypnmcxtv.com">zkcjebjx</a>
  回复  引用    
#46楼 2007-05-04 15:29 | zevnxkdt [未注册用户]
<a href="http://udsbsgse.com">mvtsbzbg</a> [URL=http://hsjefokj.com]wgnvinqp[/URL] cpfeayof http://glknkdxp.com wjvkkjzz tiemsxvy
  回复  引用    
#47楼 2007-05-05 18:42 | rmhybakq [未注册用户]
<a href="http://llmysbdf.com">cytliuwl</a> pvdhihlf http://hnhsvtlg.com iewstshx maltqvxl [URL=http://vtrcfgym.com]nzkiiqda[/URL]
  回复  引用    
#48楼 2007-05-09 04:27 | lzptcnic [未注册用户]
<a href="http://kkmgrjft.com">ifxxfvkr</a> oxvaffzp http://ruisogue.com aelvhlsp oocwoujg [URL=http://xbiccvwy.com]dvvlkbha[/URL]
  回复  引用    
#49楼 2007-05-21 16:24 | Kathy [未注册用户]
Thanks.

  回复  引用    
#50楼 2007-12-18 11:58 | jess.lv [未注册用户]
呵呵,我以前都不怎么做单元测试,每次开发完了,编译 通过运行一下,也来效果 就扔给测试员。
老是返回一大堆Bug ,自从用了Nunit 返回的bug 就少多了,
多谢楼主的推荐!!

  回复  引用  查看    
#51楼 [楼主]2007-12-18 22:10 | TerryLee      
@jess.lv
太客气了
  回复  引用    
#52楼 2008-01-19 14:50 | 鱼蛋1 [未注册用户]
请问文中介绍的工具可以做Web项目的测试吗?

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)