单元测试(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. MySQL模糊查询(like)时区分大小写

    问题说明:通过上面的语句,你会发现MySQL的like查询是不区分大小写的,因为我的失误,把Joe写成了joe才发现了这个东东吧.但是,有时候,我们需要区分大小写的是,该怎么办呢?解决方法如下: 方法 ...

  2. 10 个 Redis 建议/技巧

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/145.html?1455790611 Redis 在当前的技术社区里是非常 ...

  3. Oracle建表脚本记录

    --删除 drop table dianfei; --创建表 create table dianfei ( uon ) not null, mmonth ) not null, ddf ,) not ...

  4. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  5. Redis的介绍及使用实例.

    本文就来讲一下Redis安装的方法和Redis生成主键的优点以及和其他几种方式生成主键的对比. 1,Redis安装首先将Redis的tar包拷贝到Linux下的根目录 然后解压到redis文件夹下:( ...

  6. 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)

    基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编   ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...

  7. 更新日志 - fir.im Jenkins & Gradle 插件上线

    最近 fir.im 工程师们效率爆表,fir.im 实用工具集合又添加了新的成员-- Jenkins & Gradle 插件,让 App 打包上传更加简单快速. fir.im Jenkins ...

  8. MyBatis 环境搭建 (一)

    一.MyBatis简介 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简 ...

  9. 高性能Cordova App开发学习笔记

    高性能Cordova App开发学习笔记 文件结构 添加插件 构建准备 各个www的作用,prepare命令会将hello\www的内容会拷贝到platform下的wwww目录,知道该改哪里了吧?如果 ...

  10. Spring配置汇总

    现在主流的JavaWeb应用几乎都会用到Spring,以下是Spring的配置,以及结合Web的SpringMVC配置的汇总. jar包的引入 与Web项目集成 Spring配置文件 SpringMV ...