`

在.NET环境中使用单元测试工具NUnit

    博客分类:
  • C#
阅读更多

文章转载至http://www.iwms.net/n2140c13.aspx谢谢作者 

 

简介

  编写单元测试是一种验证行为,更是一种设计行为。同样,它更是一种编写文档的行为。编写单元测试避免了相当数量的反馈循环,尤其是功能验证方面的反馈循环。

  虽然由程序开发人员自己写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的资料。

分享到:
评论

相关推荐

    .NET单元测试工具NUnit

    .NET框架中的单元测试工具NUnit是一个广泛使用的开源测试框架,专为.NET开发者设计,用于确保代码的质量和可靠性。单元测试是一种编程实践,它允许开发者针对软件的最小可测试单元,即函数、方法或类,进行独立验证...

    单元测试工具NUnit-2.5

    总的来说,NUnit 2.5作为一款强大的单元测试工具,为.NET开发带来了高效、灵活的测试解决方案。它通过丰富的断言库、良好的测试组织结构、运行时控制、与VS2008的紧密集成以及高度的可扩展性,大大提升了软件开发的...

    单元测试工具NUnit

    .net平台下的单元测试工具,比较好用的。

    .net 测试工具NUnit

    NUnit是一个开源的、广泛使用的.NET测试工具,适用于多种.NET Framework版本,包括1.1、2.0、3.0和3.5。NUnit不仅支持基本的断言,还提供了丰富的测试功能,如参数化测试、套件测试、约束和模拟,帮助开发者构建健壮...

    Nunit单元测试工具

    **NUnit单元测试工具** NUnit是一款开源的、广泛...总之,NUnit作为.NET平台的重要单元测试工具,对于软件开发过程中的质量保证起到了关键作用。正确使用和理解NUnit的各项功能,可以有效地提升代码的可靠性和维护性。

    .Net 单元测试案例

    总结来说,.NET单元测试案例涉及到选择合适的测试框架、遵循最佳实践编写测试用例、使用mocking技术来隔离测试以及集成到开发工作流中。通过有效的单元测试,开发者可以提高代码质量,减少缺陷,增强代码的可维护性...

    最新版Nunit 2.60 .NET开发人员的单元测试利器

    总的来说,NUnit 2.60 是 .NET 开发人员进行单元测试的得力工具,其强大的功能、易用性和广泛的支持使得它成为许多开发团队的标准测试选择。通过熟练掌握和利用 NUnit,开发人员可以确保他们的代码更加健壮、稳定,...

    单元测试工具NUnit使用说明

    VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试 VS2015+NUnit+OpenCover 完成单元测试代码覆盖率测试

    单元测试工具nUnit2007

    **nUnit:单元测试工具的基石** nUnit是一款开源的、广泛用于.NET Framework的单元测试框架,它在2007年的版本为开发者提供了一种高效、灵活的方式来编写和执行测试用例,确保代码的质量和稳定性。单元测试是软件...

    Nunit-2.5 .net 单元测试工具

    NUnit是.NET开发者广泛使用的开源单元测试框架,尤其在C#编程中,它扮演着至关重要的角色。单元测试是软件开发过程中的一个关键环节,它允许程序员对代码的各个独立部分进行验证,确保它们按预期工作,从而提高软件...

    NUnit使用方法(单元测试工具)

    TDD中的程序员测试通常指的是单元测试,NUnit作为.NET中最流行的单元测试工具,适用于所有.NET语言。在TDD中,开发者首先编写测试,然后实现足够的代码来使测试通过,不断迭代此过程,确保代码质量。 NUnit的界面...

    单元测试及NUnit工具的使用

    NUnit是一个广泛使用的.NET单元测试框架。下面是一个简单的示例: ```csharp using NUnit.Framework; [TestFixture] public class TestClass { [Test] public void TestFunction() { // 调用测试方法,获取...

    visual .net nuit 测试工具

    《Visual .NET NUnit 测试工具详解》 在.NET开发领域,单元测试是保障代码质量、提升软件可维护性的重要手段。NUnit作为一个流行的开源单元测试框架,为.NET开发者提供了强大的测试支持。本文将深入探讨NUnit及其在...

    单元测试软件Nunit

    通过以上介绍,我们可以看到NUnit作为一个强大的单元测试工具,为.NET开发者提供了全面的测试支持,有助于确保软件的稳定性和可靠性。无论是新手还是经验丰富的开发者,都可以轻松上手,提升代码质量。

    NUnit单元测试工具

    NUnit是一款广泛应用于.NET开发领域的单元测试框架,它为开发者提供了强大的测试能力,确保代码的质量和可维护性。NUnit2.2.9是该工具的一个版本,支持.NET Framework 2.0,并且包含了调试信息,这对于开发和调试...

    NUnit单元测试工具,测试框架Moq

    在压缩包文件中的"单元测试"可能包含了演示如何使用NUnit编写测试用例以及如何结合Moq进行Mock操作的实例代码。这些示例对于初学者来说是非常有价值的参考资料,可以加速理解和掌握这两个工具的使用。 总之,NUnit...

    .NET单元测试 《C#单元测试.pdf》和《使用Visual Studio 2005 Team System进行单元测试.pdf》

    .NET单元测试是软件开发过程中的一个重要环节,它主要用于验证代码的独立模块是否按照预期工作。在.NET环境中,单元测试可以帮助开发者确保代码的质量,减少错误,提高可维护性,并且为持续集成和持续部署提供保障。...

    Nunit单元测试,pdf讲解使用说明,安装文件

    总的来说,NUnit为C#开发者提供了一套强大的单元测试工具,配合详细的PDF教程,可以帮助他们构建高质量、可维护的代码。通过熟练掌握NUnit,开发者不仅可以提升个人编程技能,还能提高整个团队的开发效率和软件质量...

    NUnit 2.5.1 单元测试工具

    在单元测试中,NUnit提供了丰富的断言(Assertion)类,如Assert.AreEqual()用于比较预期结果与实际结果,Assert.IsNotNull()检查对象是否为空,以及Assert.Throws()用来验证方法是否抛出预期的异常等。这些断言帮助...

Global site tag (gtag.js) - Google Analytics