- 浏览: 531555 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (230)
- java (87)
- c/c++/c# (39)
- ASP.net MVC (4)
- eclipse/visual studio (3)
- tomcat/weblogic/jetty (13)
- linux/unix/windows (20)
- html/javascript/jquery/kendo/bootstrap/layui/vue/react (31)
- hibernate/struts/spring/mybatis/springboot (21)
- lucene/solr/ELK (2)
- shiro (0)
- oracle/sqlserver/mysql/postgresql (23)
- shell/python/ruby (6)
- android (0)
- maven/ant (1)
- freemarker/thymeleaf/velocity (1)
- open source project (41)
- cache/memcached/redis (0)
- nosql/hadoop/hbase/mongodb (0)
- system architecture/dubbo/zookeeper (0)
- software testing (0)
- system optimization (0)
- system security (0)
- tcp/udp/http (2)
- roller/wordpress (2)
- 工具收藏 (8)
- 文摘 (4)
- 生活 (0)
最新评论
-
coconut_zhang:
这个demo 非常完整了,是指下面说的那个html 模版,模版 ...
flying sauser, thymeleaf实现PDF文件下载 -
a93456:
你好,你有完整的demo吗? String template这 ...
flying sauser, thymeleaf实现PDF文件下载 -
yujiaao:
fn 函数循环是没有必要的啊,可以改成
protecte ...
Java 笛卡尔积算法的简单实现 -
安静听歌:
设置了.setUseTemporaryFileDuringWr ...
使用jxl导出大数据量EXCEL时内存溢出的解决办法 -
q280499693:
写的很详细,但是我现在想知道他们是怎么定位log4j.prop ...
关于SLF4J结合Log4j使用时日志输出与指定的log4j.properties不同
简介
编写单元测试是一种验证行为,更是一种设计行为。同样,它更是一种编写文档的行为。编写单元测试避免了相当数量的反馈循环,尤其是功能验证方面的反馈循环。
虽然由程序开发人员自己写Unit Tests(单元测试)来测试自己写的程序代码已经行之有年,但是大部分的Unit Tests都是写在主要的程序代码已经设计好、写好之后。大部分的程序开发人员都有相同的的经验,在主要程序代码写好之后再来加入Unit Test是一项困难的工作,而且在时间的压力之下Unit Test通常是第一个被跳过的步骤.本篇文章介绍的是一个.NET平台的单元测试工具NUnit。
什么是Unit Tests(单元测试)?
在程序设计过程中会有许多种测试,单元只是其中的一种,单元测试并不能保证程序是完美无缺的,但是在所有的测试中,单元测试是第一个环节,也是最重要的一个环节。单元测试是一种由程序员自行测试的工作。简单点说,单元测试就是测试代码撰写者依据其所设想的方式执行是否产生了预期的结果。关于单元测试的重要性已经有许多文章做了很多深入的分析,这里就不再赘述。NUnit是一个为Net准备的自动化单元测试框架,它的作用就是帮助你方便的完成单元测试工作,同鼎鼎有名的JUnit一样,都是xUnit家族的成员。它的下载地址是:http://www.nunit.org。
NUnit Framework(NUnit 单元测试框架)简介
本文所讨论的NUnit 2.1是一个与它的先祖们(其它的Framework)非常不一样的版本。其它的xUnit家族版本通常都有一个base class(基础类),你要写的test classes(测试用例)都得inherit(继承)自这个base class。除此之外,别无他法能够让你写Unit Tests。不幸的是,这对很多的程序语言来说就造成很大的限制。比如说,Java及C#就只能允许single inheritance(单一继承)。也就是说,如果你想要refactor(重构)你的Unit Tests程序代码的话,你会遇到一些的限制;除非你引进一些复杂的inheritance hierarchies(类别继承层级)。有了.NET之后一切又不同了,.NET引进了一个新的程序开发的概念 ─ Attributes(属性),解决了这个烦人的问题。Attributes让你可以在你的程序代码之上再加入metadata(元数据,描述程序代码的资料)。一般来说Attributes不会影响到主要程序代码的执行,其功能是在你所写程序代码之上添加了额外的信息。Attributes主要使用在documenting your code(注释你的程序代码),但是Attributes也可以用来提供有关Assembly的额外信息,其它的程序就算没有见过这个Assembly,也可以使用这些信息。这基本上就是NUnit 2.1所作的事。在NUnit 2.1里面,有一个Test Runner Application(负责执行Unit Tests的程序),这个Test Runner会扫描你已经compile(编译)好的程序代码,并且从Attribute里面知道哪些classes是test classes,哪些methods是需要执行的test methods. 然后,Test Runner使用.NET的Reflection技术(在.NET Framework中提供了System.Reflection命名空间,这样就使得我们可以方便的获得.NET组件的信息。当你想获得正在使用的组件的详细信息,或者在运行期间查询一个组件信息的时候,这个功能将变的十分有用)来执行这些test methods。因为这个原因,你就不再需要让你的test classes继承自所谓的common base class。你唯一需要作的事,就是使用正确的Attribute来描述你的test classes及test methods。NUnit提供了许多不同的attributes,让你可以自由的写你想要的unit tests。这些attributes可以用来定义test fixtures(见下一段解释)、test methods,以及setup及teardown的methods(预备及善后工作的methods)。除此之外,还有其它的attributes可以来设定预期发生的exceptions,或者要求Test Runner跳过某些test method不执行。
TestFixture Attribute简介
TestFixture attribute主要是用在class上,其作用是标志该class含有需要执行的test methods。当你在一个class的定义里加上这个attribute,Test Runner就会检查该class,看看这个class是否含有test methods。底下这段程序代码示范了如何使用TestFixture Attribute。(本文中所有程序代码都是用C#写成,但是你应该知道,NUnit也是用于其它的.NET程序语言,包括VB.NET。请参见NUnit的相关文件。
namespace UnitTestingExamples
{
using System;
using NUnit.Framework;
[TestFixture]
public class SomeTests
{
}
}
使用TextFixture Attribute的class需要符合另一项唯一附加的限制,就是需要有一个public的default constructor(或者是没有定义任何的constructor,这其实是相同的意思)。
TestFixtureSetUp 和TestFixtureTearDown简介
这两个主要用在TestFixture里面,其作用是提供一组函数执行任何测试运行之前(TestFixtureSetUP)和最后一个测试执行后(TestFixtureTearDown)。每一个TestFixture只能有一个TestFixtureSetUp方法和TestFixtureTearDown方法。如果一个以上的TestFixtureSetUp和TestFixtureTearDown方法,可以通过编译但是不会执行。注意一个TestFixture可以拥有一个TestFixtureSetUp和一个SetUp,也可以拥有一个TestFixtureTearDown和一个TearDown方法。
TestFixtureSetUp 和 TestFixtureTearDown 被用在不方便使用SetUp和TearDown方法。
一般情况使用 SetUp 和TearDown attributes。
底下这段程序代码示范了如何使用TestFixtureSetUp/TestFixtureTearDown
namespace UnitTestingExamples
{
using System;
using NUnit.Framework;
[TestFixture]
public class SomeTests
{
[TestFixtureSetUp]
public void RunBeforeAllTests()
{
Console.WriteLine( “TestFixtureSetUp” );
}
[TestFixtureTearDown]
public void RunAfterAllTests()
{
Console.WriteLine( “TestFixtureTearDown” );
}
[SetUp]
public void RunBeforeEachTest()
{
Console.WriteLine( “SetUp” );
}
[TearDown]
public void RunAfterEachTest()
{
Console.WriteLine( “TearDown” );
}
[Test]
public void Test1()
{
Console.WriteLine( “Test1” );
}
}
}
程序的输出将是下面的结果::
TestFixtureSetUp
SetUp
Test1
TearDown
SetUp
Test2
TearDown
TestFixtureTearDown
如果Test2单独执行输出的结果将是:
TestFixtureSetUp
SetUp
Test2
TearDown
TestFixtureTearDown
Test Attribute简介
Test attribute主要用来标示在text fixture中的method,表示这个method需要被Test Runner application所执行。有Test attribute的method必须是public的,并且必须return void,也没有任何传入的参数。如果没有符合这些规定,在Test Runner GUI之中是不会列出这个method的,而且在执行Unit Test的时候也不会执行这个method。上面的程序代码示范了使用这个attribute的方法。
SetUp 和 Teardown Attributes简介
在写Unit Tests的时候,有时你会需要在执行每一个test method之前(或之后)先作一些预备或善后工作。当然,你可以写一个private的method,然后在每一个test method的一开头或最末端呼叫这个特别的method。或者,你可以使用我们要介绍的SetUp及Teardown Attributes来达到相同的目的。如同这两个Attributes的名字的意思,有Setup Attribute的method会在该TextFixture中的每一个test method被执行之前先被Test Runner所执行,而有Teardown Attribute的method则会在每一个test method被执行之后被Test Runner所执行。一般来说,Setup Attribute及Teardown Attribute被用来预备一些必须的objects(对象),例如database connection、等等。上面的程序代码示范了使用这个attribute的方法。
ExpectedException Attributes简介
有的时候,你希望你的程序在某些特殊的条件下会产生一些特定的exception。要用Unit Test来测试程序是否如预期的产生exception,你可以用一个try..catch的程序区段来catch(捕捉)这个exception,然后再设一个boolean的值来证明exception的确发生了。这个方法固然可行,但是太花费功夫。事实上,你应该使用这个ExpectedException attribute来标示某个method应该产生哪一个exception,如同下面的范例所示:
namespace UnitTestingExamples
{
using System;
using NUnit.Framework;
[TestFixture]
public class SomeTests
{
[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void Test1()
{
// Do something that throws an InvalidOperationException
}
}
}
如果上面的程序被执行的时候,如果一旦exception发生,而且这个exception的type(类型信息)是InvalidOperationException 的话,这个test就会顺利通过验证。如果你预期你的程序代码会产生多个exception的话,你也可以一次使用多个ExpectedException attribute。但是,一个test method应该只测试一件事情,一次测试多个功能是不好的做法,你应该尽量避免之。另外,这个attributes并不会检查inheirtance的关系,也就是说,如果你的程序代码产生的exception是继承自InvalidOperationException 的subclass(子类化)的话,这个test执行的时候将不会通过验证。简而言之,当你使用这个attribute的时候,你要明确的指明所预期的exception是哪个type(类型信息)的。
Ignore Attributes简介
这个attribute你大概不会经常用的,但是一旦需要的时候,这个attribute是很方便使用的。你可以使用这个attribute来标示某个test method,叫Test Runner在执行的时候,略过这个method不要执行。使用这个Ignore attribute的方法如下:
namespace UnitTestingExamples
{
using System;
using NUnit.Framework;
[TestFixture]
public class SomeTests
{
[Test]
[Ignore("We're skipping this one for now.")]
public void TestOne()
{
// Do something...
}
}
}
如果你想要暂时性的comment out一个test method的话,你应该考虑使用这个attribute。这个attribute让你保留你的test method,在Test Runner的执行结果里面,也会提醒你这个被略过的test method的存在。
NUnit Assert Class简介
除了以上所提到的这些用来标示测试程序所在的attributes之外,NUnit还有一个重要的class你应该要知道如何使用。这个class就是Assert class。Assert class提供了一系列的static methods,让你可以用来验证主要程序的结果与你所预期的是否一样。Assert class代替了旧的Assertion class,下面是这个类的方法:
Assert.IsTrue( bool );
Assert.IsFalse( bool );
Assert.IsNull( bool );
Assert.IsNotNull( bool );
Assert.AreSame( object, object )
Assert.AreEqual( object, object );
Assert.AreEqual( int, int );
Assert.AreEqual( float, float, float );
Assert.AreEqual( double, double, double );
Assert.Fail();
使用这个类的示例如下:
namespace UnitTestingExamples
{
using System;
using NUnit.Framework;
[TestFixture]
public class SomeTests
{
[Test]
public void TestEventLengthString()
{
// Should return true
bool bResult1 = Class1.CheckPalindrome("ABCCBA");
Assert.IsTrue(bResult1);
// Should return false
bool bResult2 = Class1.CheckPalindrome("ABCDBA");
Assert.IsFalse(bResult2);
}
[Test]
public void TestOddLengthString()
{
//should return true;
Assert.IsTrue(Class1.CheckPalindrome("ABCDCBA"));
// Should return false
Assert.IsFalse(Class1.CheckPalindrome("ABCDEBA"));
}
}
}
执行你的Tests
好,现在我们已经讨论过写Unit Tests的基本步骤及方法,现在让我们来看看如何执行你所写的Unit Tests。事实上非常简单。NUnit里面有两个已经写好的Test Runner applications:一个是窗口GUI程序,一个是console XML(命令列)程序。你可以自由选择你所喜欢的方式,基本上是没有什么差别的。
如果你要使用窗口GUI的Test Runner app,你只需要执行该程序,然后告诉它你要执行的test method所在的assembly位置。这个包含有你所写test methods的assembly是那一个class library(或是executable,*.dll或*.exe) assembly,其中含有前面谈到的Test Fixtures。当你告诉Test Runner你的assembly所在的位置,Test Runner会自动load这个asembly,然后把所有的class及test methods都列在窗口的左栏。当你按下’Run’按键时,你就会自动执行所有列出来的test methods。你也可以double click其中的一个test class,或是一个test method之上,这样会自动只执行该class或是该method。
底下是窗口GUI Test Runner执行时的样子:
在一些的情况下,特别是你想要在你自己写的build script中加入Unit Testing的情况下,你大概不会使用GUI Test Runner。在这个自动执行build script的情况下,你一般会把你build的结果贴在网页,或写入log file里面存作纪录,以供程序开发人员、经理或是客户可以藉由检查这个纪录知道详细情况。在这个情况,你可以用NUnit 2.1的console Test Runner application。这个Test Runner可以传入assembly的位置当参数,其测试执行结果是一个XML字符串。你可以用XSLT或是CSS把这个XML结果转换成HTML,或是其它你想要的格式。如果你需要用到这个功能的话,请查看NUnit文件中有关console Test Runner application的资料。
发表评论
-
CMPP短信网关客户端发送程序
2010-04-06 11:12 4717最近无聊,玩了玩ubuntu ... -
C#编程中的预处理指令
2010-01-13 11:22 1401在C#中, 虽然编译器没有单独的预处理器,但在处理预处理指令时 ... -
vs 打包winform程序步骤经验总结
2010-01-06 09:47 58451、 应用程序文件夹 : 在应用程序文件夹下新建一文件夹重名为 ... -
处理资源 'http://localhost/ws/Service.asmx' 时出错(iis,.netframework安装顺序造成的错)
2009-12-30 17:10 1909刚刚学习webservices,很多东西都不懂。写了个最简单的 ... -
图解在VS2005利用NUnit进行测试
2009-12-21 12:53 1555一、介绍NUnit是一款用于在.net环境进行单元测试的工具, ... -
如何编写单元测试用例(转载自CSDN)
2009-12-17 17:01 3161一、 单元测试的概念 ... -
NUnit2.0详细使用方法
2009-12-17 17:00 10685 .测试生命周期合约 如果记得test case的定义,其中 ... -
NUnit2.0详细使用方法
2009-12-17 16:58 11631、初识NUnitNUnit是一个开源单元测试框架,它提高一套 ... -
.NET命名空间使用介绍
2009-12-17 11:29 1712在ASP.NET中,.NET Framework为我们 ... -
一种清晰而又简单通用的分页算法
2009-12-17 10:03 6090分页,是WEB开发中面对的最常见的编程,实现方法多种多样。我也 ... -
C#数据结构-双向链表
2009-12-17 09:54 1956在结点中设两个引用域,一个保存直接前驱结点的地址,叫prev, ... -
读书笔记c#高级编程 委托和事件
2009-12-17 09:49 1097在C#中使用一个类时,分两个阶段。首先需要定义这个类,即告诉编 ... -
深入理解C#中的委托和事件:委托的定义
2009-12-16 16:04 1642委托和事件在 .Net Framework中的应用非常广泛,然 ... -
C#委托和事件(简单示例)
2009-12-16 15:46 38291.委派的实现过程。 首先来看一下委派,委派其实就是方法的传 ... -
关于配置文件的读取
2009-11-18 16:52 2069在1.0/1.1版本,都流行的 ... -
C# WInForm 无框窗体移动
2009-11-12 13:56 2014调用APIusing System.Runtime.Inter ... -
在C# 中如何动态地添加控件
2009-09-09 11:05 3648通常在写程序的时候 ... -
ListBox相互移动
2009-08-14 17:33 1430using System;using System.Colle ... -
TreeView-demo
2009-08-14 17:22 1318using System;using System.Co ... -
TreeView高效绑定数据
2009-08-13 17:28 4100前俩个项目都是做政府的门户网,他们的栏目、部门都要以树形展示, ...
相关推荐
编写单元测试是一种验证行为,更是一种设计行为。同样,它更是一种编写文档的行为。编写单元测试避免了相当数量的反馈循环,尤其是...本篇文章介绍的是一个.NET平台的单元测试工具NUnit。 什么是Unit Tests(单元测试)?
软件测试是软件工程中的最重要的一个环节,而单元测试是软件测试中的很重要的一个步骤,DOT单元测试工具NUnit全部由C#编写
.net平台下的单元测试工具,比较好用的。
VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试 VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试
针对.net framework1.1和2.0,3.0,3.5的单元测试工具
nunit是一项开源的项目,利用nunit,你可以方便快捷地对已有的.net组件进行单元测试。利用nunit,你可以在不修改原有代码的情况下,编写专门的测试代码对需要测试的函数和组件进行测试
大名鼎鼎的Nunit 是单元测试的利器。C#开发的人都知道 单元部分测试是最头疼的。有了它 一切问题 不用猜测 直接调用写好的Dll 即可测试
还记得 .NET Framework 的 ASP.NET WebForm 吗?那个年代如果要在 Web 层....NET Core 常用的测试工具还有 NUnit 和 MSTest,我本人习惯用 xUnit 作为测试工具,所以本文用的是 xUnit。 创建示例项目 先用 ASP.NET Core
它以插件的形式集成在Visual Studio.NET IDE中的单元测试工具,能够兼容各种Visual Studio版本,并且集成了多种单元测试框架诸如NUnit,MbUnit,以及Visual Studio Team System适配器等。 TestDriven.NET的前身是...
NUnit是一个单元测试框架,专门针对于.NET来写的.其实在前面有JUnit(Java),CPPUnit(C++),他们都是xUnit的一员.
针对.net开发的测试工具,nunit是一个单元测试框架
NUnit是一个.NET上的单元测试框架。NUnit 1.x主要是移植JUnit 3.8。从2.0版本开始,NUnit进行了重写和重新设计,使用Attributes代替特定的方法和相应的基类。 6. MyGeneration MyGeneration是一个功能很强大的代码...
NUnit .Net单元测试工具
里面包括.net1.1和.net2.0的测试工具
引言在软件开发领域,测试驱动开发(TestDrivenDevelopment,TDD)技术在逐渐为广大开发者所接受,它是在添加新代码之前让你的测试代码出错...它是以插件的形式集成在VisualStudio.NETIDE中的单元测试工具,能够兼容各
NUnit2.6.2 单元测试工具,.Net下使用。
Nunit 是一个单元测试框架,专门针对于.NET来写的,它适合于所有.NET语言
TestDriven.NET 是一款优秀的...它以插件的形式集成在Visual Studio.NET IDE中的单元测试工具,能够兼容各种Visual Studio版本,并且集成了多种单元测试框架诸如NUnit,MbUnit,以及Visual Studio Team System适配器等
一个新的.net测试工具手册,...它是以插件的形式集成在Visual Studio.NET IDE中的单元测试工具,能够兼容各种Visual Studio版本,并且集成了多种单元测试框架诸如NUnit,MbUnit,以及Visual Studio Team System适配器等