单元测试(Unit Test)的一个测试用例(Test Case)是一小段代码,用于测试一个小的程序功能的行为是否正常,保证开发的功能子项能正确完成并实现其基本功能。一个单元测试是用于判断某个特定条件下某个特定函数的行为。单元测试是随功能代码一起的一个配套工具,再配合面向接口编程方法Mock技术,大大提高代码的可测试性。

  • 白盒测试:测试单元的内部结构;
  • 黑盒测试:测试单元的功能和可观测行为;

1. NUnit是什么

NUnit 免费开源 (http://www.nunit.org),提供一套单元测试框架(专用于.Net的白盒测试架构)和一个测试运行程序(test runner)。其中,test tunner 用于寻找具有[TestFixture]属性的类和类中的[Test]方法。 

2. TDD思想

在功能代码未完成前,先进行测试代码的编写;测试不应着眼于功能代码,应着眼于设计。定义TDD的2个原则:

  • 除非你有一个失败的自动测试,永远不要写一单行代码;
  • 阻止重复;

3. 使用NUnit

测试原则

  • 可靠性、可维护性、可读性;
  • 尽量避免测试中的逻辑,一个单元测试应该是一系列的方法调用和断言;
  • 避免重复代码;
  • 测试隔离,低耦合,防止不同测试之间的互相影响;

NUnit属性
所有NUnit属性都包含在 Nunit.Framework 命名空间里,同时必须引用程序集 Nunit.Framework.dll。在项目测试时,有时要用到数据库链接,一般将数据库链接串放到Web.config配置文件里,再通过

System.Configuration.ConfigurationSettings.AppSettings[“DBConnectionString”].ToString();

获取,但是在测试中是读不到这个值的,测试时要把链接写成固定字符串。
TestFixture:修饰测试类。类必须为public且必须有一个默认构造函数。
Test:修饰测试方法。测试方法的返回值必须为void。
TestCase:修饰测试方法。标记方法具有参数并提供测试时需要的参数,例:[TestCase(参数列表)]
Values:标记作为测试方法的一系列的参数。
Combinatorial:测试时需要测试的各种可能的组合; [Test, Combinatorial]

public void TestFunction01( [Values(1,2,3)]int val, [Values(“you”,”hi”)]string str ) {} 

SetUp/TearDown

修饰方法,测试类初始化/资源释放函数。每个测试方法被调用之前/后执行,用于环境的建立/清理、初始化/释放资源。属性从任何的基类继承而来,被修饰的方法必须为public。
[TestFixtureSetUp/TestFixtureTearDown]

OneTimeSetUp/OneTimeTearDown
修饰方法,测试用例初始化/资源释放函数。任何测试方法被调用之前/后执行,类似构造/析构函数,其作用于整个[TestFixture]类,包括数据库连接等,被修饰的方法必须为public。
SetUp/TearDown方法提供达到测试隔离性的目的:SetUp确保共享的资源在每个测试运行前正确初始化,TearDown确保没有因运行测试产生的遗留副作用;TestFixtureSetUp/TestFixtureTearDown同样提供相同的目的,但是却在SetUp/TearDown方法之前/后。
Ignore:修饰类或方法,保证测试正常进行的前提下,临时动态忽略某些测试方法。 [Ignore(“提示信息”)]
Category:修饰类或方法,分类/分组管理测试类或方法; [Category(标签)]

NUnit方法
在NUnit中,Assert(断言)是一个类,断言是Assert类的静态方法。断言是单元测试的核心,用类中的各种方法进行比较,也可以在NUnit的断言中添加自己的错误信息。注意以下几个方法:
Assert.Fail():让测试直接失败;
Assert.Ignore():让测试被忽略;
Assert.AreEqual/AreNotEqual (object expected, object actual): 比较参数expected和actual的值(类型)是否相等;
Assert.IsTrue/IsFalse (bool condition): 条件断言测试;
Assert.AreSame/AreNotSame (object expected, object actual): 比较两个参数是否引用同一个对象;
另外,还有StringAssert类,字符串断言,提供对字符串值的测试方法。
如果一个方法中有多个断言,某个断言执行失败,在其之后的所有断言都不会执行。具体的,NUnit~Assert类

NUnit ~ 测试集管理
NUnit的很多功能是通过属性来实现,属性是在.NET组件文件的Metadata中添加的一些可以被其他组件读取的信息,用中括号标识。NUnit根据测试组件的命名空间及[TestFixture]和[Test]属性来分类不同的测试。

  • 测试分类
  • 分组运行

NUnit ~ Demo
单元测试项目文件推荐命名:项目名称_Test,源文件基本结构如下:

[TestFixture]
public class TestFunction
{
[OneTimeSetUp]
public void TestFixtureSetUp() { Console.WriteLine("OneTimeSetUp()"); }
[OneTimeTearDown]
public void TestFixtureTearDown() { Console.WriteLine("OneTimeTearDown()"); } [SetUp]
public void SetUp() { Console.WriteLine("SetUp()"); }
[TearDown]
public void TearDown() { Console.WriteLine("TearDown()"); } [Test]
public void TestMethod01() { Console.WriteLine("TestMethod01()"); }
[Test]
public void TestMethod02() { Console.WriteLine("TestMethod02()"); }
}

测试几个方法的执行顺序:

OneTimeSetUp -> SetUp -> TestMethod01 -> TearDown -> SetUp -> TestMethod02 -> TearDown -> OneTimeTearDown

此处可以结合不足之处的第2点理解。
NUnit ~ 单步调试
单元测试之单步调试设置方法参考如下链接:
http://www.cnblogs.com/ywqu/archive/2009/11/04/lindongshenghuo.html    

不足之处

  • 1. xUnit体系中JUnit是在测试每个方法时新生成一个实例,而NUnit中是一个TestFixture只生成一个实例。如果对包含单元测试类中的实例数据进行更改可能会影响到其它的测试方法,而JUnit每次都生成一个实例则不会产生这种情况。
  • 2. JUnit中[SetUp]/[TearDown]只会在所有测试前、后分别执行一次,而NUnit是在每个测试前、后都会执行一次,为了达到JUnit中[SetUp]/[TearDown]的效果,能新增[TestFixtureSetUp]/[TestFixtureTearDown]属性。

参考

[1]. 单元测试之道(使用NUnit)
[2]. 用NUnit在单元测试中实现构造函数依赖注入
[3]. NUnit单元测试教程以及Mock测试

C# ~ NUnit单元测试的更多相关文章

  1. NUnit单元测试

    单元测试对程序员来说是非常重要的一门技术,但是在实际编程中却往往被程序员所忽视.微软的VS开发工具为我们提供了强大的单元测试环境,在VS当中可以直接对类库项目进行测试,极大的方便了程序员的自我纠错能力 ...

  2. NUnit单元测试资料汇总

    NUnit单元测试资料汇总 从安装到配置 首先到官网http://www.nunit.org/下载如下图的资料,安装NUnit-2.6.1.msi包. 然后挂在VS2010外部工具这个地方来使用,工具 ...

  3. Nunit单元测试入门学习随笔(一)

    Nunit单元测试 一.插件安装与项目关联 选择工具~扩展和更新 点击联机~搜索Nunit安装图内三个插件 新建单元测试项目 勾选项目引用 二.Nunit学习 1.了解单元测试 单元测试在我的理解是测 ...

  4. (二)NUnit单元测试心得

    现在接着上次说到的内容,如何在项目中进行单元测试.由于做了一些调整,我上次发的内容,我这次也会重新发一次,请认真看看. 一.软件开发过程中存在的问题(没有使用单元测试的情况下) 难于定位bug的位置 ...

  5. (一)NUnit单元测试心得

    由于各种缘由,一本<.Net单元测试艺术>突然出现在了我的办公桌上,于是我的单元测试之路就此开始.通过一两个月不间断的学习,以及不断结合具体的项目做开发,再结合书上的知识对单元测试有了一些 ...

  6. nunit单元测试详解

    在粗略看了代码后,下面就详细说明相应的测试标记(属性)的用法. [TestFixture(arguments)]属性标记类为测试类,若没有填写参数,则测试类必须含有无参构造函数,否则需要相应的有参构造 ...

  7. NUnit单元测试示例

    单元测试的用法 1.下载NUnit软件 安装后打开界面如图: 2.新建测试项目 添加类库项目并在NuGet管理包中添加NUnit 这里添加NuGet的NUnit包要注意保持版本和之前下载的NUnit软 ...

  8. Visual Studio 2012使用NUnit单元测试实践01,安装NUnit并使用

    在Visual Studio 2012中,默认使用Microsoft自带的MS-Test测试框架.但,Visual Studio同样允许使用第三方测试框架,比如NUnit,xUnit,MbUnit,等 ...

  9. NUnit单元测试笔记

    vs2010 和 NUnit 问题处理. . 在 <configuration> 下 加 ... <startup> <requiredRuntime version=& ...

随机推荐

  1. ehcache2拾遗之copyOnRead,copyOnWrite

    问题描述 缓存在提升应用性能,提高访问效率上都是至关重要的一步.ehcache也是广为使用的缓存之一.但是如果将一个可变的对象(如普通的POJO/List/Map等)存入缓存中,会导致怎样潜在的问题. ...

  2. 元素设置为display:none,其绑定的事件仍存在

    元素设置为display:none,虽然该元素从页面中消失了,其绑定的事件仍存在. <body> <button class="button1">chang ...

  3. Java-条件语句、循环语句练习

    题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)? double height=0.08; for(int i=1;i>0;i++) { heig ...

  4. lua表排序

    对于lua的table排序问题,一般的按照value值来排序,使用table.sort( needSortTable , func)即可(可以根据自己的需要重写func,否则会根据默认来:默认的情形之 ...

  5. Masonry -- 使用纯代码进行iOS应用的autolayout自适应布局

    简介 简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstraints. 项目主页: Masonry 最新示例: 点击下载 项目简议: 如果再看到关于纯代 ...

  6. 快速入门系列--WebAPI--03框架你值得拥有

    接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...

  7. Socket实现仿QQ聊天(可部署于广域网)附源码(2)-服务器搭建

    1.前言 这是本系列的第二篇文章,第一篇文章得到了很多朋友们的支持,在这里表示非常的感谢.对于这一系列文章需要补充的是这只是一篇入门级别的Socket通信文章,对于专业人员来说完全可以跳过.本文只介绍 ...

  8. C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)

    我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类.我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和 ...

  9. CSS布局(上)

    CSS布局(上) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !import ...

  10. XML序列化的时候如何支持Namespace

    我曾经不止一次(当然不仅仅是我意识到这个问题)说到过,XML标准中的Namespace的设计其实是一个较为失败的设计,它有它的优点,但缺点更多. http://zzk.cnblogs.com/s?w= ...