`

NUnit详细使用方法

 
阅读更多

NUnit详细使用方法

NUnit2.0详细使用方法
注:NUnit中文文档可以参看我的另一个站点:http://www.36sign.com/nunit

前一段时间,有人问我在.NET里如何进行TDD开发.这个问题促使我想对NUnit做一个详细的介绍.因为我们大家都知道NUnit是在.NET进行TDD的利器.
如果你已经知道很多关于NUnit的应用,请指出我的不对之处和提出一些建议,使本文更加完善.如果你对NUnit还不是很了解的话,我建议你还是阅读一下.
本文分为以下部分:

1. TDD的简介

首先什么是TDD呢?Kent Beck在他的<<测试驱动开发 >>(Addison-Wesley Professional,2003)一书中,使用下面2个原则来定义TDD:
·除非你有一个失败的自动测试,永远不要写一单行代码.
·阻止重复
我想第一个原则是显而易见的.在没有失败的自动测试下就不要写代码.因为测试是嵌入在代码必须满足的需求中.如果没有需求,就没有必要实现任何东西.所以这个原则阻止我们去实现那些没有测试和在解决方案中不需要的功能.
第二个原则说明了在一个程序中,不应该包含重复的代码.如果代码重复,我想这就是不好的软件设计的象征.随着时间的流逝,它会对程序造成不一致 的问题,并且使代码变非常混乱 ,因为我们时常不会记得重复代码的位置.如果发现代码重复,我想我们应该立即删除代码重复.其实这就涉及到重构了.在这里我就不多讲了.
一般来说,测试分为2种类型,一是程序员自己的测试,另外一种是客户的测试.关于客户测试,我推荐一个FIT的框架,非常不错。在这里,我们讲 的TDD就是程序员测试.那么什么是程序员测试呢?我认为就是我们常说的单元测试.既然是单元测试,在.NET里势必会用到某些工具,目前最著名恐怕就是 我即将介绍的NUnit了,

2.NUnit的介绍

NUnit是一个单元测试框架,专门针对于.NET来写的.其实在前面有JUnit(Java),CPPUnit(C++),他们都是xUnit的一员.最初,它是从JUnit而来.现在的版本是2.2.接下来我所用的都是基于这个版本.
NUnit最初是由James W. Newkirk, Alexei A. Vorontsov 和Philip A. Craig, 后来开发团队逐渐庞大起来.在开发过程中, Kent Beck 和Erich Gamma2位牛人也提供了许多帮助.看来对于NUnit还真是下了一番力气了.J
NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等.
最重要的一点是它适合于所有.NET语言.
如果你还没有下载,可以到http://www.nunit.org/去下载.

2.1 NUnit的介绍

Ok,下面正式讲解NUnit.在讲解之前,看看几张图片:
图1 NUnit运行的效果

图2 NUnit运行的另外一个效果
从中我们可以非常容易发现,右边是个状态条,图1是红色的,图2是绿色的.为什么会这样呢?因为如果所有测试案例运行成功,就为绿色,反之如果有一个不成功,则为红色,但也有黄色的.左面的工作域内则是我们写的每一个单元测试.
通过上面的图片,我想你对NUnit有个总的了解了.
接下来还是分为2个部分,一是NUnit的布局,另外一部分就是它的核心概念.
首先熟悉一下NUnit GUI的布局.
让我们更进一步看一下测试运行器窗口的布局。在右边面板的中间,可以看到测试进度条。进度条的颜色反映了测试执行的状态:
  • 绿色 描述目前所执行的测试都通过
  • 黄色 意味某些测试忽略,但是这里没有失败
  • 红色 表示有失败
底部的状态条表示下面的状态:
  • 状态.说明了现在运行测试的状态。当所有测试完成时,状态变为Completed.运行测试中,状态是Running: <test-name> (<test-name>是正在运行的测试名称)。
  • Test Cases说明加载的程序集中测试案例的总个数。这也是测试树里叶子节点的个数。
  • Tests Run 已经完成的测试个数。
  • Failures 到目前为止,所有测试中失败的个数.
  • Time 显示运行测试时间(以秒计)
File主菜单有以下内容:
  • New Project允许你创建一个新工程。工程是一个测试程序集的集合。这种机制让你组织多个测试程序集,并把他们作为一个组对待。
  • Open 加载一个新的测试程序集,或一个以前保存的NUnit工程文件。
  • Close关闭现在加载的测试程序集或现在加载的NUnit工程。
  • Save 保存现在的Nunit工程到一个文件。如果正工作单个程序集,本菜单项允许你创建一个新的NUnit工程,并把它保存在文件里。
  • Save As允许你将现有NUnit工程作为一个文件保存。
  • Reload 强制重载现有测试程序集或NUnit工程。NUnit-Gui自动监测现加载的测试程序集的变化。
当程序集变化时,测试运行器重新加载测试程序集。(当测试正运行时,现在加载的测试程序集不会重新加载。在测试运行之间测试程序集仅可以重新加 载。一个忠告:如果测试程序集依赖另外一个程序集,测试运行器不会观察任何依赖的程序集。对测试运行器来说,强制一个重载使全部依赖的程序集变化可见。
  • Recent Files 说明5个最近在NUnit中加载的测试程序集或NUnit工程(这个列表在Windows注册表,由每个用户维护,因此如果你共享你的PC,你仅看到你的测试)。最近程序集的数量可以使用Options菜单项修改,可以访问Tool主菜单。
  • Exit退出。
  • View菜单有以下内容:
  • Expand一层层扩展现在树中所选节点
  • Collapse 折叠现在树中选择的节点
  • Expand All递归扩展树中所选节点后的所有节点
  • Collapse All递归折叠树中所选节点后的所有节点
  • Expand Fixtures扩展树中所有代表测试fixture的节点。
  • Collapse Fixtures 折叠树中所有代表测试fixture的节点。
  • Properties 显示树中现所选节点的属性。
  • Tools 菜单由这些项:
  • Save Results as XML作为一XML文件保存运行测试的结果。
  • Options让你定制NUnit的行为。
现在看看右边,你已经熟悉Run按钮和进度条。这里还有一个紧跟Run按钮的Stop按钮:点击这个按钮会终止执行正运行的测试。进度条下面是一个文本窗口,在它上方,由以下4个标签:
  • Errors and Failures 窗口显示失败的测试。在我们的例子里,这个窗口是空。
  • Tests Not Run 窗口显示没有得到执行的测试。
  • Console.Error 窗口显示运行测试产生的错误消息。这些此消息是应用程序代码使用Console.Error输出流可以输出的。
  • Console.Out窗口显示运行测试打印到Console.Error输出流的文本消息。

2.2 一些常用属性

接下来,我将讲述这个框架如何使用.同时也涉及到一些非常重要的概念,我想其客户属性是非常重要的.在NUnit里,有以下几种属性:
  • TestFixture
  • Test
下面我将对每种属性一一讲解.

TestFixtureAttribute

本属性标记一个类包含测试,当然setup和teardown方法可有可无.(关于setup 和teardown方法在后面介绍)
做为一个测试的类,这个类还有一些限制
  • 必须是Public,否则NUnit看不到它的存在.
  • 它必须有一个缺省的构造函数,否则是NUnit不会构造它.
  • 构造函数应该没有任何副作用,因为NUnit在运行时经常会构造这个类多次,如果要是构造函数要什么副作用的话,那不是乱了.
举个例子

1usingSystem;
2usingNUnit.Framework;
3namespaceMyTest.Tests
4{
5
6[TestFixture]
7publicclassPriceFixture
8{
9//
10}

11}

12


TestAttribute

Test属性用来标记一个类(已经标记为TestFixture)的某个方法是可以测试的.为了和先前的版本向后兼容,头4个字符(“test”)忽略大小写.(参看http://nunit.org/test.html)
这个测试方法可以定义为:

publicvoidMethodName()


从上面可以看出,这个方法没有任何参数,其实测试方法必须没有参数.如果我们定义方法不对的话,这个方法不会出现在测试方法列表中.也就是说在NUnit的界面左边的工作域内,看不到这个方法.还有一点就是这个方法不返回任何参数,并且必须为Public.
例如:

1usingSystem;
2usingNUnit.Framework;
3
4namespaceMyTest.Tests
5{
6[TestFixture]
7publicclassSuccessTests
8{
9[Test]publicvoidTest1()
10{/**//**/}
11}

12}

13
14


一般来说,有了上面两个属性,你可以做基本的事情了.

另外,我们再对如何进行比较做一个描述。
在NUnit中,用Assert(断言)进行比较,Assert是一个类,它包括以下方法:AreEqual,AreSame,Equals, Fail,Ignore,IsFalse,IsNotNull,具体请参看NUnit的文档。

3.如何在.NET中应用NUnit

我将举个例子,一步一步演示如何去使用NUnit.

第1步.为测试代码创建一个Visual Studio工程。

在Microsoft Visual Studio .NET中,让我们开始创建一个新的工程。选择Visual C#工程作为工程类型,Class Library作为模板。将工程命名为NUnitQuickStart.图4-1是一个描述本步骤的Visual Studio .NET。

图 4-1: 创建第一个NUnit工程

第2步.增加一个NUnit框架引用

在Microsoft Visual Studio .NET里创建这个例子时,你需要增加一个NUnit.framework.dll引用,如下:
在Solution Explorer右击引用,然后选择增加引用
NUnit.framework组件,在Add Reference对话框中按Select和OK按钮。
图4-2 描述了这步:

图 4-2: 增加一个 NUnit.framework.dll 引用到工程

第3步.为工程加一个类.

为工程加一个NumbersFixture类。这里是这个例子的代码。
1usingSystem;
2usingNUnit.Framework;
3
4namespaceNUnitQuickStart
5{
6[TestFixture]
7publicclassNumersFixture
8{
9[Test]
10publicvoidAddTwoNumbers()
11{
12inta=1;
13intb=2;
14intsum=a+b;
15Assert.AreEqual(sum,3);
16}

17}

18}

19

第4步.建立你的Visual Studio 工程,使用NUnit-Gui测试

从程序->NUnit2.2打开NUnit-gui,加载本本工程编译的程序集.
为了在Visual Studio .NET中自动运行NUnit-Gui,你需要建立NUnit-Gui作为你的启动程序:
在 Solution Explorer里右击你的NunitQuickStart工程。
在弹出菜单中选择属性。
在显示的对话框的左面,点击Configuration Properties夹
选择出现在Configuration Properties夹下的Debugging。
在属性框右边的Start Action部分,选择下拉框的Program作为Debug Mode值。
按Apply按钮
设置NUnit-gui.exe 作为Start Application。,你既可以键入nunit-gui.exe的全路径,也可使用浏览按钮来指向它。
图4-3 帮助描述本步骤:
图 4-3:将NUnit-Gui 作为工程的测试运行器

第5步.编译运行测试.

现在编译solution。成功编译后,开始应用程序。NUnit-Gui测试运行器出现。当你第一次开始NUnit-Gui,它打开时没有测试加载。从File菜单选择Oprn,浏览NUnitQuickStart.dll的路径。当你加载了测试的程序集,测试运行器为加载的程序集的测试产生一个可见的表现。在例子中,测试程序集仅有一个测试,测试程序集的结构如图4-4所示:

图 4-4: 测试程序集的测试在 NUnit-Gui中的视图
按Run按钮。树的节点变为绿色,而且测试运行器窗口上的进度条变绿,绿色代表成功通过。

4.其他的一些核心概念

上面的例子介绍了基本的NUnit特性和功能. TestFixture, Test, 和 Assert是3 个最基本的特征,我们可以用这些特性进行程序员测试了.但是有的时候,你觉得这3个远远不够,比如有的时候打开一个数据库连接多次,有没有只让它打开一次 的方法呢?如果我想把测试分类,应该怎样实现呢?如果我想忽略某些测试,又应该如何去完成呢?不用担心,NUnit已经有这样的功能了.
下面我们一一作出回答.

SetUp/TearDown 属性

在早期给的test fixture定义里,我们说test fixture的测试是一组常规运行时资源.在测试完成之后,或是在测试执行种,或是释放或清除之前,这些常规运行时资源在一确定的方式上可能需要获取和初始化.NUnit使用2个额外的属性:SetUpTearDown,就支持这种常规的初始化/清除.我们上面的例子来描述这个功能.让我们增加乘法.
1usingSystem;
2usingNUnit.Framework;
3
4namespaceNUnitQuickStart
5{
6[TestFixture]
7publicclassNumersFixture
8{
9[Test]
10publicvoidAddTwoNumbers()
11{
12inta=1;
13intb=2;
14intsum=a+b;
15Assert.AreEqual(sum,3);
16}

17[Test]
18publicvoidMultiplyTwoNumbers()
19{
20inta=1;
21intb=2;
22intproduct=a*b;
23Assert.AreEqual(2,product);
24}

25
26}

27}

28
我们仔细一看,不对,有重复的代码,如何去除重复的代码呢?我们可以提取这些代码到一个独立的方法,然后标志这个方法为SetUp 属性,这样2个测试方法可以共享对操作数的初始化了,这里是改动后的代码:
1usingSystem;
2usingNUnit.Framework;
3
4namespaceNUnitQuickStart
5{
6[TestFixture]
7publicclassNumersFixture
8{
9privateinta;
10privateintb;
11[SetUp]
12publicvoidInitializeOperands()
13{
14a=1;
15b=2;
16}

17
18[Test]
19publicvoidAddTwoNumbers()
20{
21intsum=a+b;
22Assert.AreEqual(sum,3);
23}

24[Test]
25publicvoidMultiplyTwoNumbers()
26{
27intproduct=a*b;
28Assert.AreEqual(2,product);
29}

30
31}

32}

33
 这样NUnit将在执行每个测试前执行标记SetUp属性的方法.在本例中就是执行InitializeOperands()方法.记住,这里这个方法必须为public,不然就会有以下错误:Invalid Setup or TearDown method signature 

ExpectedException

这里是一个验证这个假设的测试.有的时候,我们知道某些操作会有异常出现,例如, 在实例中增加除法,某个操作被0除,抛出的异常和.NET文档描述的一样.参看以下源代码.

1[Test]
2[ExpectedException(typeof(DivideByZeroException))]
3publicvoidDivideByZero()
4{
5intzero=0;
6intinfinity=a/zero;
7Assert.Fail("Shouldhavegottenanexception");
8}

9


除了[Test]属性之外, DivideByZero方法有另外一个客户属性: ExpectedException. 在这个属性里,你可以在执行过程中捕获你期望的异常类型,例如在本例就是DivideByZeroException.如果这个方法在没有抛出期望异常的 情况下完成了,这个测试失败.使用这个属性帮助我们写程序员测试验证边界条件(Boundary Conditions).

Ignore 属性

由于种种原因,有一些测试我们不想运行.当然,这些原因可能包括你认为这个测试还没有完成,这个测试正在重构之中,这个测试的需求不是太明确.但你有不想破坏测试,不然进度条可是红色的哟.怎么办?使用Ignore属性.你可以保持测试,但又不运行它们.让我们标记MultiplyTwoNumbers测试方法为Ignore属性:

1[Test]
2[Ignore("Multiplicationisignored")]
3publicvoidMultiplyTwoNumbers()
4{
5intproduct=a*b;
6Assert.AreEqual(2,product);
7}


运行测试,现在产生了下面的输出(在图5-1显示):

图 5-1: 在一个程序员测试中使用 Ignore属性
Ignore属性可以附加到一个独立的测试方法,也可以附加到整个测试类(TestFixture).如果Ignore属性附加到TestFixture,所有在fixture的测试都被忽略.

TestFixtureSetUp/TestFixtureTearDown

有时,一组测试需要的资源太昂贵.例如,数据库连接可能是一个关键资源,在一个test fixture的每个测试中,打开/关闭数据库连接可能非常慢.这就是我在开始提到的问题.如何解决?NUnit有一对类似于前面讨论的SetUp/TearDown的属性: TestFixtureSetUp/TestFixtureTearDown.正如他们名字表明的一样,这些属性用来标记为整个test fixture初始化/释放资源方法一次的方法.
例如,如果你想为所有test fixture的测试共享相同的数据库连接对象,我们可以写一个打开数据库连接的方法,标记为TestFixtureSetUp属性,编写另外一个关闭数据库连接的方法,标记为TestFixtureTearDown属性.这里是描述这个的例子.

1usingNUnit.Framework;
2
3[TestFixture]
4publicclassDatabaseFixture
5{
6[TestFixtureSetUp]
7publicvoidOpenConnection()
8{
9//opentheconnectiontothedatabase
10}

11
12[TestFixtureTearDown]
13publicvoidCloseConnection()
14{
15//closetheconnectiontothedatabase
16}

17
18[SetUp]
19publicvoidCreateDatabaseObjects()
20{
21//inserttherecordsintothedatabasetable
22}

23
24[TearDown]
25publicvoidDeleteDatabaseObjects()
26{
27//removetheinsertedrecordsfromthedatabasetable
28}

29
30[Test]
31publicvoidReadOneObject()
32{
33//loadonerecordusingtheopendatabaseconnection
34}

35
36[Test]
37publicvoidReadManyObjects()
38{
39//loadmanyrecordsusingtheopendatabaseconnection
40}

41}

42
43


Test Suite

Test Suite是test case或其他test suite的集合. 合成(Composite),模式描述了test case和test suite之间的关系.
参考来自NUnit的关于Suite的代码
Suite Attribute

1namespaceNUnit.Tests
2{
3usingSystem;
4usingNUnit.Framework;
5
6
7
8publicclassAllTests
9{
10[Suite]
11publicstaticTestSuiteSuite
12{
13get
14{
15TestSuitesuite=newTestSuite("AllTests");
16suite.Add(newOneTestCase());
17suite.Add(newAssemblies.AssemblyTests());
18suite.Add(newAssertionTest());
19returnsuite;
20}

21}

22}

23}

24
Category属性

对于测试来说,你有的时候需要将之分类,此属性正好就是用来解决这个问题的。
你可以选择你需要运行的测试类目录,也可以选择除了这些目录之外的测试都可以运行。在命令行环境里 /include 和/exclude来实现。在GUI环境下,就更简单了,选择左边工作域里的Catagories Tab,选择Add和Remove既可以了。
在上面的例子上做了一些改善,代码如下:

1usingSystem;
2usingNUnit.Framework;
3
4namespaceNUnitQuickStart
5{
6[TestFixture]
7publicclassNumersFixture
8{
9privateinta;
10privateintb;
11[SetUp]
12publicvoidInitializeOperands()
13{
14a=1;
15b=2;
16}

17
18[Test]
19[Category("Numbers")]
20publicvoidAddTwoNumbers()
21{
22intsum=a+b;
23Assert.AreEqual(sum,3);
24}

25
26[Test]
27[Category("Exception")]
28[ExpectedException(typeof(DivideByZeroException))]
29publicvoidDivideByZero()
30{
31intzero=0;
32intinfinity=a/zero;
33Assert.Fail("Shouldhavegottenanexception");
34}

35[Test]
36[Ignore("Multiplicationisignored")]
37[Category("Numbers")]
38publicvoidMultiplyTwoNumbers()
39{
40intproduct=a*b;
41Assert.AreEqual(2,product);
42}

43
44}

45


NUnit-GUI界面如图5-2:
 
图5-2:使用Catagories属性的界面

Explicit属性

本属性忽略一个test和test fixture,直到它们显式的选择执行。如果test和test fixture在执行的过程中被发现,就忽略他们。所以,这样一来进度条显示为黄色,因为有test或test fixture忽略了。
例如:
1
2[Test,Explicit]
3[Category("Exception")]
4[ExpectedException(typeof(DivideByZeroException))]
5publicvoidDivideByZero()
6{
7intzero=0;
8intinfinity=a/zero;
9Assert.Fail("Shouldhavegottenanexception");
10}

11
为什么会设计成这样呢?原因是Ingore属性忽略了某个test或test fixture,那么他们你再想调用执行是不可能的。那么万一有一天我想调用被忽略的test或test fixture怎么办,就用Explicit属性了。我想这就是其中的原因吧。

Expected Exception属性

期望在运行时抛出一个期望的异常,如果是,则测试通过,否则不通过。
参看下面的例子:
1[Test]
2[ExpectedException(typeofInvalidOperationException))]
3publicvoidExpectAnException()
4{
5intzero=0;
6intinfinity=a/zero;
7Assert.Fail("Shouldhavegottenanexception");
8
9}

10
在本测试中,应该抛出DivideByZeroException,但是期望的是InvalidOperationException,所以不能通过。如 果我们将[ExpectedException(typeof(InvalidOperationException))]改为 [ExpectedException(typeof(DivideByZeroException))],本测试通过。

5 . 测试生命周期合约

如果记得test case的定义,其中一个属性是测试的独立性或隔离性.SetUp/TearDown方法提供达到测试隔离性的目的.SetUp确保共享的资源在每个测试运行前正确初始化,TearDown确保没有运行测试产生的遗留副作用. TestFixtureSetUp/TestFixtureTearDown同样提供相同的目的,但是却在test fixture范围里,我们刚才描述的内容组成了测试框架的运行时容器(test runner)和你写的测试之间的生命周期合约(life-cycle contract).
为了描述这个合约,我们写一个简单的测试来说明什么方法调用了,怎么合适调用的.这里是代码:

1usingSystem;
2usingNUnit.Framework;
3[TestFixture]
4publicclassLifeCycleContractFixture
5{
6[TestFixtureSetUp]
7publicvoidFixtureSetUp()
8{
9Console.Out.WriteLine("FixtureSetUp");
10}

11
12[TestFixtureTearDown]
13publicvoidFixtureTearDown()
14{
15Console.Out.WriteLine("FixtureTearDown");
16}

17
18[SetUp]
19publicvoidSetUp()
20{
21Console.Out.WriteLine("SetUp");
22}

23
24[TearDown]
25publicvoidTearDown()
26{
27Console.Out.WriteLine("TearDown");
28}

29
30[Test]
31publicvoidTest1()
32{
33Console.Out.WriteLine("Test1");
34}

35
36[Test]
37publicvoidTest2()
38{
39Console.Out.WriteLine("Test2");
40}

41
42}

43
44


当编译和运行这个测试,可以在System.Console窗口看到下面的输出:

FixtureSetUp
SetUp
Test
1
TearDown
SetUp
Test
2
TearDown
FixtureTearDown


可以看到, SetUp/TearDown方法调用在每个测试方法的前后. 整个fixture调用一次TestFixtureSetUp/TestFixtureTearDown方法.
下载:
1)NUnit的应用文档 下载
2)本问的PDF版 下载
3)本文的源代码下载
参考
2) James W. NewkirkandAlexei A. Vorontsov ,Test-Driven Development in Microsoft .NET,Microsoft Press,2003
4) Kent Beck, Test-Driven Development: By Example ,Addison-Wesley Professional, 2003
5) Andrew Hunt ,David Thomas ,Pragmatic Unit Testing In C# With NUnit
6) NUnit中文文档:http://www.36sign.com/nunit
Last Updated:2005年6月23日
Last Updated:2007年4月12日

posted on 2005-06-20 17:01 Confach 阅读(22232) 评论(76) 编辑 收藏 所属分类: 框架&库敏捷软件开发

<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://www.cnblogs.com/confach/archive/2005/06/20/177817.html" dc:identifier="http://www.cnblogs.com/confach/archive/2005/06/20/177817.html" dc:title="NUnit详细使用方法" trackback:ping="http://www.cnblogs.com/confach/services/trackbacks/177817.aspx" /> </rdf:RDF> -->

评论

#1楼 2005-06-20 17:30 neuhawk [未注册用户]

good,我很喜欢nunit,虽然现在开发还不是先写测试,后写实现。
但nunit对于重构有很大的帮助。 回复引用查看

#2楼[楼主] 2005-06-20 18:33 Milestone

没错,NUnit在我的开发中起到了很大作用. 回复引用查看

#3楼 2005-06-20 19:04 二十四画生

Good! 回复引用查看

#4楼 2005-06-20 19:37 barton131420

NUnit:想说爱你不容易!
其一是没有象JUnit那样带相应的IDE插件;其二时完全没有可扩展性。JUnit最受欢迎之处就是整个体系是可扩展的,而且事实上有非常多的 成熟的开源的扩展件。JUnit已经发展成为一个功能完善的庞大体系,一个不可或缺的开发伴侣,单纯的JUnit不可能取得如此的成功。但是NUnit却 始终无法受到开发者欢迎。NUit的TestFixtureAttribute/TestAttribute等标签都是封闭类,不能扩展;可供扩展的 TestCase和Assertion类又设计成了遗弃类。这些设计都严重限制了NUnit的扩展能力。换句话说,NUnit没有象JUnit一样提供足 够的扩展能力。不要说我是武断地下了以上结论。你看看几个有限的扩展(例如NUnitAsp/NUnitForms)的窘迫就明白我的苦衷了。 回复引用查看

#5楼 2005-06-21 08:30 寒枫天伤 [未注册用户]

NUnit有vs.net的插件的,那个NUnit Addin就可以(现在是TestDrivern.NET了)。

不过,NUnit在可扩展性确实没考虑什么。 回复引用查看

#6楼[楼主] 2005-06-21 08:32 Milestone

@barton131420
你的说法我认为很有道理,一个好的软件我想应该是易于扩展,并且有相应的IDE支持,,如果没有,Plugin也好,恐怕NUnit的就是处于这样窘境.
我用过一个VSNUnit的Plugin,但是用了几个月之后,发现还是有些Bug的.所以后来也没有用了,不知道Bug fix没有.http://sourceforge.net/projects/vsnunit/
但是不管它怎么样,确实给我的工作带来了许多便利.希望它能发展的更好的一些. 回复引用查看

#7楼 2005-06-21 08:38 hudan

good 回复引用查看

#8楼 2005-06-21 09:41 Jason.NET

这篇文章不错,收藏起来 回复引用查看

#9楼 2005-06-21 15:16 James

good! 回复引用查看

#10楼[楼主] 2005-06-22 16:45 Milestone

对于Test Suite,大家有没有好的例子呀? 回复引用查看

#11楼 2005-06-23 09:32 a [未注册用户]

兄弟,你从哪儿翻译的?有些地方翻译得实在是……例如:
“必须是Public,或者NUnit看不到它的存在. ”这句话,很明显,单词or应该翻译为“否则”

其他地方也很蹩脚 回复引用查看

#12楼 2005-08-13 23:37 binking

强烈的支持!
对于一些翻译的枝节问题,请不要小题大做了!
能把自己宝贵的休息时间奉献出来,
就是非常非常值得肯定的!
再次强烈支持!
回复引用查看

#13楼[楼主] 2005-08-14 10:07 Milestone

谢谢@binking 的支持,只要本文中有错误或者不当的,我一定会Update的.对于编程一样,对于写Blog也一样. 回复引用查看

#14楼 2005-08-27 10:52 極速麻醉

好文章! 回复引用查看

#15楼 2005-08-30 09:15 沉默天蝎的.net学习汇集

好文章!!
我收藏起来,谢谢了!
回复引用查看

#16楼 2005-10-12 14:25 BlackAngel [未注册用户]

为什么例子都是返回VOID 并且无输入参数以及都是实例方法的?不能给点其他返回类型,有输入参数,或者是静态方法的例子。 回复引用查看

#17楼[楼主] 2005-11-04 09:34 Milestone

To BlackAngel
你可以参看一下NUnit的文档,就知道是怎么回事 了。 回复引用查看

#18楼 2005-11-20 23:26 QuitGame

可惜的是不能对 DotNet 2。0的程序进行测试 回复引用查看

#19楼[楼主] 2005-11-21 17:41 Milestone

估计不久就会支持2.0吧。 回复引用查看

#20楼 2005-12-10 10:40 孙悟空 [未注册用户]

支持!多谢指点! 回复引用查看

#21楼[楼主] 2006-01-28 22:00 milestone

我没有用过VS2005,但是听说它自己自带了单元测试。可能微软对于这方面有所考虑。不管怎么样,NUnit确实给我们带来了很大的好处。即使微软自带了,但是只要习惯了NUnit,其仍然存在不可磨灭的价值。 回复引用查看

#22楼[楼主] 2006-01-28 22:04 milestone

刚才到NUnit的网站看了一下,NUnit开始支持.NET 2.0了,非常令人振奋的消息。 回复引用查看

#23楼 2006-02-17 23:28 gg [未注册用户]

文章写得不错.只不过有个词"客户属性",还是改成"定制特性"吧. 回复引用查看

#24楼[楼主] 2006-02-18 15:21 milestone

@gg
Sorry,可能这个名词给你带来了一点麻烦,希望知道是什么意思.

对于是否是客户属性还是定制属性,反正英文是不变的.呵呵 回复引用查看

#25楼 2006-02-19 01:27 gg [未注册用户]

呵呵,milestone太客气了.我看到"客户属性"这个词,估计了一下英文,然后知道是什么意思的,因为它跟反射在一起.比较好认.
在custom attribute里面.custom一般翻译为定制或自定义,至于attribute,虽然联机文档翻的是属性,不过可能翻译为特性更好一点,因为属性已经有对应的词property.
一点想法,仅供参考,其实怎么翻都无所谓啦:) 回复引用查看

#26楼[楼主] 2006-02-19 12:27 milestone

@gg
谢谢。很多计算机的术语翻译成中文都有很多种,关键是能看明白就行。还有就是一些通用翻译,咱可不能硬改了,反而有些不伦不类了。你说呢
回复引用查看

#27楼 2006-04-05 15:20 Wangzk [未注册用户]

ding 回复引用查看

#28楼 2006-04-16 19:47 ∮随风而去~ [未注册用户]

看来其中不乏达人啊~学习~! 回复引用查看

#29楼 2006-04-30 14:11 Tony.Gong

最近在小项目中实践了部分单元测试,有了一些心得,也写了几篇文章,希望得到大家指正。谢谢。
http://batoosai.cnblogs.com/category/55575.html

由于我主要用vb.net的,所以大部分示例都是vb。net的 回复引用查看

#30楼[楼主] 2006-04-30 14:36 milestone

@Tony.Gong
语言不是问题..关键是思想.. 回复引用查看

#31楼 2006-06-06 16:18 wjb [未注册用户]

Good! 回复引用查看

#32楼[楼主] 2006-06-06 17:14 LIVE

@wjb
谢谢,有什么问题和建议,bug尽管提出,本文不断的更新。 回复引用查看

#33楼 2006-08-30 21:28 coolsun [未注册用户]

这东西简单易用!不用费怎么多精力来介绍吧!介绍了半天还都是那些东西! 回复引用查看

#34楼 2006-10-11 15:33 gj [未注册用户]

ding 回复引用查看

#35楼 2006-11-06 11:42 show [未注册用户]

我觉得Nunit里怎么操作,怎么一步步写一下 回复引用查看

#36楼 2006-11-09 14:11 chengbo

谢谢,你带我走进了单元测试的大门 回复引用查看

#37楼[楼主] 2006-11-09 16:18 LIVE

@show
个人认为上面的步骤应该可以解决如何做的问题了。 回复引用查看

#38楼[楼主] 2006-11-09 16:19 LIVE

@chengbo
谢谢你的关注,能听见你这样的回应也是对我的一种鼓励!谢谢! 回复引用查看

#39楼 2006-11-10 00:05 Hunter[匿名] [未注册用户]

顶,好文章,希望看到更多好文章,谢谢! 回复引用查看

#40楼[楼主] 2006-11-10 09:11 LIVE

@Hunter[匿名]
谢谢
回复引用查看

#41楼 2006-11-11 19:24 ddd [未注册用户]

好极了,非常感谢,正是我急需的。再次thank you very much
qq:583165450 回复引用查看

#42楼[楼主] 2006-11-11 19:28 LIVE

@ddd
Thanks 回复引用查看

#43楼 2006-11-16 15:33 狂风

不错不错。。。好文。 回复引用查看

#44楼[楼主] 2006-11-17 11:49 LIVE

@狂风
Thanks 回复引用查看

#45楼 2006-12-06 14:13 风云

好文章呀! 回复引用查看

#46楼[楼主] 2006-12-06 20:26 LIVE

@风云
thanks 回复引用查看

#47楼 2006-12-26 15:44 nunitasp [未注册用户]

3q for your article!!! 回复引用查看

#48楼[楼主] 2006-12-27 13:45 LIVE

thanks 回复引用查看

#49楼 2006-12-31 19:29 winrun [未注册用户]

好文!!!!!!!!!!多谢!·!!!!! 回复引用查看

#50楼 2007-02-01 15:25 jack [未注册用户]

非常非常好啊...早点看到就好了.. 回复引用查看

#51楼 2007-02-26 11:45 greateway [未注册用户]

请问各位大虾,如何把Nunit放在自动构建脚本中(如MSBuild),自动生成测试报告,并发送邮件。 回复引用查看

#52楼[楼主] 2007-02-26 15:19 LIVE

@greateway
可以试图一下研究NUnit的命令行,http://www.nunit.org/index.php?p=consoleCommandLine&r=2.2.9. 回复引用查看

#53楼 2007-03-09 00:31 中文版NUnit [未注册用户]

中文版NUnit http://www.nunit.cn 回复引用查看

#54楼 2007-03-09 08:36 ColdDog

好久没有单元测试了.... 回复引用查看

#55楼[楼主] 2007-03-09 09:31 LIVE

@中文版NUnit
希望能把这个办好呀。需要帮忙的话,可以联系我! 回复引用查看

#56楼[楼主] 2007-03-09 09:32 LIVE

@ColdDog
要是这样的话,还是多用用吧!只要写代码,什么时候都可以用得到! 回复引用查看

#57楼 2007-03-13 00:07 snoopy [未注册用户]

好,太谢谢啊~ 回复引用查看

#58楼[楼主] 2007-03-13 09:41 LIVE

@snoopy
thanks,helpful for you, hopefully! 回复引用查看

#59楼[TrackBack] 2007-03-13 10:56 FrankFei

http://www.cnblogs.com/confach/archive/2005/06/20/177817.html前一段时间,有人问我在.NET里如何进行TDD开发.这个问题促使我想对NUni...
[引用提示]FrankFei引用了该文章, 地址: http://www.cnblogs.com/feipeng/archive/2007/03/13/672801.html 回复引用查看

#60楼 2007-04-10 18:22 ifs kit [未注册用户]

very veryvery veryvery very good!!!!!
很感谢~~ 回复引用查看

#61楼[楼主] 2007-04-11 09:30 Confach

@ifs kit
不用这么多very吧:) 回复引用查看

#62楼 2007-04-12 11:12 ifs kit [未注册用户]

赫赫~还是要的.最近突然想看看这东西.找到这么detailed使用方法.很是HAPPY~~ 回复引用查看

#63楼[楼主] 2007-04-12 17:02 Confach

@ifs kit
希望这篇文章不会让你失望 回复引用查看

#64楼 2007-04-13 09:26 ifs kit [未注册用户]

我想不会的.呵呵~ 回复引用查看

#65楼 2007-07-27 15:06 wanglinBlog

不错,看完有收获,谢谢 回复引用查看

#66楼 2007-08-01 09:45 请教 [未注册用户]

我采用了上面的例子在 vs 2005里面运行,怎么不行啊 回复引用查看

#67楼 2007-08-07 12:56 allen [未注册用户]

非常好,谢谢。 回复引用查看

#68楼 2007-09-06 11:26 ricky [未注册用户]

菜鸟来顶一下!
你们都是牛人,英语也很牛! 回复引用查看

#69楼 2007-09-10 22:53 Timothy [未注册用户]

非常不错,感谢楼主为大家提供这么细致的文章。
测试驱动我刚刚才接触,看见有些朋友留言说Nunit的缺点,我想任何一项技术都有优点和缺陷,如果这项技术本身的立意是好的,起到的作用是积极的,就值得我们去肯定和学习,也相信好东西并非一蹴而就,总是要随着被广泛地使用而变得越来越完善! 回复引用查看

#70楼 2007-09-18 23:15 寒书生 [未注册用户]

有兄弟帮我下:使用NUnitAsp的测试程序的组成有那些?
小弟愚笨请教 急......急......急!!! 回复引用查看

#71楼[TrackBack] 2007-09-20 11:36 凌松

在.NET环境中使用单元测试工具NUnit
[引用提示]凌松引用了该文章, 地址: http://www.cnblogs.com/zcjian/articles/899444.html 回复引用查看

#72楼 2007-09-20 18:52 寒书生 [未注册用户]

--引用--------------------------------------------------
寒书生: 有兄弟帮我下:使用NUnitAsp的测试程序的组成是那三点?
小弟愚笨请教 急......急......急!!!
楼主看见了请帮帮忙解释下...谢谢!!!
--------------------------------------------------------
回复引用查看

#73楼 2007-09-22 23:20 寒书生 [未注册用户]

@LIVE
楼主能帮我解决下:使用NUnitAsp的测试程序的组成是那三点?
小弟愚笨请教 急......急......急!!!
楼主看见了请帮帮忙解释下...谢谢!!! 回复引用查看

#74楼[楼主] 2007-09-23 13:07 Confach

@寒书生
NUnitAsp我没有用过,但是我看了一下其文档,感觉就是Nunit的扩展,不过看起来比较简单.至于你说的测试程序的组成是有三点,我不太清楚.非得说有三点,可以如下:
1. 测试的页面控件对象
2. 测试对象所在的页面对象
3. 断言

这是我的看法,因为我没有用过NUnitAsp,所以不敢妄下结论 回复引用查看

#75楼 2007-09-26 23:06 寒书生 [未注册用户]

谢谢楼主...@Confach
回复引用查看

#76楼 2007-11-06 12:09 fanrsh

thanks for you article 回复引用查看

<!--Beging Temp Save--> <script type="text/javascript"> function pageLoad() { Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(handleInitializeRequest); //Sys.WebForms.PageRequestManager.getInstance().add_endRequest(handleEndRequest); } function handleInitializeRequest(sender, args) { var prm = Sys.WebForms.PageRequestManager.getInstance(); var eid = args.get_postBackElement().id; if (eid.indexOf("DeleteLink")>0) { args.get_postBackElement().innerHTML = "<font color='red'>正在删除...</font>"; } else if (eid.indexOf("btnSubmit")>0) { document.getElementById("AjaxHolder_PostComment_ltSubmitMsg").innerHTML="正在提交..."; document.getElementById("AjaxHolder_PostComment_btnSubmit").disabled = true; } else if(eid.indexOf("refreshList")>0) { document.getElementById("AjaxHolder_PostComment_refreshList").innerHTML="<font color='red'>正在刷新...</font>"; } } function TempSave(ElementID) { try { CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value); CommentsPersistDiv.save("CommentXMLStore"); } catch(ex) { } } function Restore(ElementID) { CommentsPersistDiv.load("CommentXMLStore"); document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent"); } </script><!--Ene TempSave-->

<script type="text/javascript"><!-- google_ad_client = "pub-4210569241504288"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as"; google_ad_type = "text"; google_ad_channel =""; google_color_link = "6699CC"; //--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script><iframe width="468" scrolling="no" height="60" frameborder="0" allowtransparency="true" hspace="0" vspace="0" marginheight="0" marginwidth="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4210569241504288&amp;dt=1197545955390&amp;lmt=1197545952&amp;format=468x60_as&amp;output=html&amp;correlator=1197545955375&amp;url=http%3A%2F%2Fconfach.cnblogs.com%2Farchive%2F2005%2F06%2F20%2F177817.aspx&amp;color_link=6699CC&amp;ad_type=text&amp;ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3Dnunit%2B%26cl%3D3&amp;cc=3&amp;ga_vid=1038948784.1197545955&amp;ga_sid=1197545955&amp;ga_hid=1839544562&amp;flash=9&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_his=1&amp;u_java=true&amp;u_nplug=5&amp;u_nmime=10" name="google_ads_frame"></iframe>


标题 请输入标题
姓名 请输入你的姓名
主页
Email (只有博主才能看到)邮件地址无效
请输入验证码
验证码 *
内容(请不要发表任何与政治相关的内容) 请输入评论内容
Remember Me?
登录使用高级评论新用户注册返回页首恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2007-04-12 09:43 编辑过
西部数据 Caviar SE鱼子酱 WD1600AAJS SATAII接口台式机硬盘(160G/7200转/8M)盒装 迪科代理 易迅只要369元,亏本大甩卖
分享到:
评论

相关推荐

    NUnit2.0详细使用方法

    NUnit2.0详细使用方法

    Nunit.dll+详细使用方法

    Nunit是一个单元测试工具,其使用方法简单,便于进行单元测试

    单元测试工具NUnit2.0详细使用方法

    单元测试工具NUnit2.0主要用于C#程序的测试

    NUnit2.0 详细使用方法

    这个问题促使我相对NUnit做一个详细的介绍.因为我们大家都知道NUnit是在.NET进行TDD的利器. 如果你已经知道很多关于NUnit的应用,请指出我的不对之处和提出一些建议,使本文更加完善.如果你对NUnit还不是很了解的话,...

    nUnit 使用方法

    给初学者介绍关于NUnit2.0详细使用方法

    NUnit-Test.rar_NUnit

    利用NUnit进行单元测试。讲述NUnit测试的原理、过程、方法,并有大量详细步骤

    测试框架nunit之assertion断言使用详解

    NUnit是.Net平台的测试框架,广泛用于.Net平台的单元测试和回归测试中,下面我们用示例详细学习一下他的使用方法

    Nunit单元测试程序

    TestFixture属性:用来标识类,表示这个可能包含有用于测试的方法。 Test属性:用来标识方法,表示这个方法需要进行测试(前提是该方法所在的类是可以测试的)。 SetUp属性:用来标识方法,在开始所有测试之前执行,...

    TestDriven.NET-3.0.2749_Personal

    其中一些新特性有:支持MSTest、.NET Reflector 6 Pro、VS 2010、Silverlight 4、NUnit 2.5.3,使用项目所用的.NET框架等。 TestDriven.NET原来叫做NUnitAddIn,它是个Visual Studio插件,集成了如下测试框架:...

    编写代码文档资料ndoc1.3

    编写代码文档资料几乎总是一项令人畏惧的任务。我所说的不是早期设计文档,甚至也不是更为详细的设计文档;我说的是记录类上的各个方法和属性。...下面是 NUnit 示例中的一个用 XML 编写了文档的方法:

    Ocaramba:使用Selenium WebDriver自动化测试的C#框架

    可以在以下位置找到项目API文档: : 它提供以下功能: 支持.NET Framework 4.5、4.7.2和.NET Core 3.1 支持跨平台Windows,Linux和macOS系统准备执行并行测试,更多详细信息 可以使用MSTest,NUnit或xUNIT框架准备...

    asp.net知识库

    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...

    Holiday-Planner

    我选择与NUnit一起使用,因为我对此已有一些经验。 这也使我能够将解决方案开发为不带任何UI框架的独立类库,这对我来说真的是一次很酷的体验。 方法: 我认为我从一开始就对问题有了很好的了解,并在前进的过程中...

    CleanArchitecture:Angular 10和.NET 5的Clean Architecture解决方案模板

    通过单击上面的“使用此模板”按钮或安装并运行相关的NuGet程序包,可以基于此模板创建新项目(有关详细信息,请参阅《入门》)。 技术领域 ASP.NET Core 5 实体框架核心5 角度10 中介 自动贴图 流利验证 NUnit...

Global site tag (gtag.js) - Google Analytics