单元测试(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. 测试博文中添加可执行JS代码

    昨天申请开通了博客园的JS权限,今天来看看效果. 测试执行JS 测试执行JS // 运行

  2. vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化)

    环境准备 软件:vmware workstation 9.0    ubuntu-12.04.2-server-amd64(官方下载) 硬件:确认CPU支持虚拟化VM-T vmware设置 vmwar ...

  3. 早安Visual Studio!一次重构之旅,夏洛特烦恼

    vs问题描述 我的IDE版本是vs2013,今天新开发了一个功能,是一个接口程序,当F5调试时,出现了莫名的错误,为什么呢?因为vs弹出了下面的一个框,只说是“未将对象引用设置到对象实例“. 点击”确 ...

  4. ios CGRect

    /*     rect(x,y,width,height);     width, height正负代表了从原点的绘制方向,矩形的长宽都是取得绝对值     */            // Do a ...

  5. Atitit 编程语言知识点tech tree v2 attilax大总结

    Atitit 编程语言知识点tech tree v2 attilax大总结 大分类中分类小分类知识点原理与规范具体实现(javac#里面的实现phpjsdsl(自己实现其他语言实现 类与对象实现对象实 ...

  6. localStorage使用

    localStorage使用 需要注意的是,HTML5本地存储只能存字符串,任何格式存储的时候都会被自动转为字符串,所以读取的时候,需要自己进行类型的转换. 支持的情况如上图,IE在8.0的时候就支持 ...

  7. 插入排序java代码

    /** * 插入排序 * * 原理:从数组中取出一个值插入到一个左边已经排好序的数组片段中 * * @param a * @return */ public long[] InsertSort(lon ...

  8. Sybase数据库收集表及其索引的统计信息

    更新表及其索引的统计信息: update table statistics 表名 go update index statistics 表名 go 建议此操作在闲时操作.

  9. 再次用CodeIgniter实现简易blog

    天变冷了,人也变得懒了不少,由于工作的需要,最近一直在学习CodeIgniter(CI)框架的使用,没有系统的从PHP基本语法学起,在网上靠百度谷歌,东拼西凑的实现了一些简单的功能.所以,老PHPer ...

  10. AngularJS入门心得2——何为双向数据绑定

    前言:谁说Test工作比较轻松,最近在熟悉几个case,差点没疯.最近又是断断续续的看我的AngularJS,总觉得自己还是没有入门,可能是自己欠前端的东西太多了,看不了几行代码就有几个常用函数不熟悉 ...