C# ~ NUnit单元测试
- 白盒测试:测试单元的内部结构;
- 黑盒测试:测试单元的功能和可观测行为;
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单元测试的更多相关文章
- NUnit单元测试
单元测试对程序员来说是非常重要的一门技术,但是在实际编程中却往往被程序员所忽视.微软的VS开发工具为我们提供了强大的单元测试环境,在VS当中可以直接对类库项目进行测试,极大的方便了程序员的自我纠错能力 ...
- NUnit单元测试资料汇总
NUnit单元测试资料汇总 从安装到配置 首先到官网http://www.nunit.org/下载如下图的资料,安装NUnit-2.6.1.msi包. 然后挂在VS2010外部工具这个地方来使用,工具 ...
- Nunit单元测试入门学习随笔(一)
Nunit单元测试 一.插件安装与项目关联 选择工具~扩展和更新 点击联机~搜索Nunit安装图内三个插件 新建单元测试项目 勾选项目引用 二.Nunit学习 1.了解单元测试 单元测试在我的理解是测 ...
- (二)NUnit单元测试心得
现在接着上次说到的内容,如何在项目中进行单元测试.由于做了一些调整,我上次发的内容,我这次也会重新发一次,请认真看看. 一.软件开发过程中存在的问题(没有使用单元测试的情况下) 难于定位bug的位置 ...
- (一)NUnit单元测试心得
由于各种缘由,一本<.Net单元测试艺术>突然出现在了我的办公桌上,于是我的单元测试之路就此开始.通过一两个月不间断的学习,以及不断结合具体的项目做开发,再结合书上的知识对单元测试有了一些 ...
- nunit单元测试详解
在粗略看了代码后,下面就详细说明相应的测试标记(属性)的用法. [TestFixture(arguments)]属性标记类为测试类,若没有填写参数,则测试类必须含有无参构造函数,否则需要相应的有参构造 ...
- NUnit单元测试示例
单元测试的用法 1.下载NUnit软件 安装后打开界面如图: 2.新建测试项目 添加类库项目并在NuGet管理包中添加NUnit 这里添加NuGet的NUnit包要注意保持版本和之前下载的NUnit软 ...
- Visual Studio 2012使用NUnit单元测试实践01,安装NUnit并使用
在Visual Studio 2012中,默认使用Microsoft自带的MS-Test测试框架.但,Visual Studio同样允许使用第三方测试框架,比如NUnit,xUnit,MbUnit,等 ...
- NUnit单元测试笔记
vs2010 和 NUnit 问题处理. . 在 <configuration> 下 加 ... <startup> <requiredRuntime version=& ...
随机推荐
- [nRF51822] 3、 新年也来个总结——图解nRF51 SDK中的Button handling library和FIFO library
:本篇是我翻译并加入自己理解的nRF51 SDK中按钮相关操作的库和先进先出队列库.虽然是nRF51的SDK,但是通过此文你将更多地了解到在BSP(板级支持)上层嵌入式程序或OS的构建方法. 1.按钮 ...
- 如何选择前端框架:ANGULAR VS EMBER VS REACT
最近一段时间是令前端工程师们非常兴奋的时期,因为三大Web框架陆续发布新版本,让我们见识到了更强大的Web框架.Ember2.0在2个月之前已经发布,从1.0升级到2.0非常简单.几周之前React发 ...
- 网络异步编程(C#)团购课
新生命开发团队大石头讲解网络异步编程(C#) 内容:网络编程基础.IOCP.APM.SAEA 时长:2~3小时 价格:20元,20人及以上成团,http://item.taobao.com/item. ...
- 我也说百度和google
对于程序员,最好的老师恐怕还是百度或者google或一些专业的it社区.网站了罢! 之前曾听到这样的一句话, 文艺程序员用Google Scholar/Scirus/stackoverflow.普通程 ...
- 正式开始jQuery源码的学习
查了一些资料,2.0.3版本的jq源码分析的资料比较多,就以这个版本研究学习了. 今天正式开始.
- swift 创建单例模式
一.意图 保证一个类公有一个实例,并提供一个访问它的全局访问点. 二.使用场景 1.使用场景 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时 当这个唯一实例应该是通过子类化可扩展的,并且 ...
- H5常用代码:适配方案4
前面有分享了4种适配方案,但始终是通过手动缩放或者视口缩放来实现,用来做一些专题页,或者功能相对简单的项目来说也是完全能应付的,但整体来说感觉还是一种缩放,说不上是真正的适配,言外之意就是即将分享真正 ...
- [常见问题]Project facet Java versin 1.8 is not support.
发生这个问题的原因是我们的java编译环境(JDK版本),与tomcat运行环境(JDK或JRE版本)不一致导致的. 到eclipse的设置中找到compile项(或右键项目进入),看一下编译环境的J ...
- Atitit 修改密码的功能流程设计 attilax总结
Atitit 修改密码的功能流程设计 attilax总结 1.1. 注意点1 1.2. 设计修改用户密码功能时把用户ID保存在哪里?1 1.3. Ui设计1 1.4. 功能设计源码1 1.5. Agt ...
- Java项目——模拟电话薄联系人增删改查
该项目模拟了电话本记录联系人的业务功能,用来练习对数据库的增删改查等操作. 菜单类:Menu -- 用来封装主菜单和个选项的子菜单 Person类: Person--联系人的实体类 TelNoteRe ...