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=& ...
随机推荐
- [ACM_几何] F. 3D Triangles (三维三角行相交)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/A 题目大意:给出三维空间两个三角形三个顶点,判断二者是否有公共 ...
- Linux—解压缩
压缩和解压("//"命令的解释) 常用压缩格式 .zip .gz .bz2 .tar.bz2 .tar.gz .zip格式压缩: zip 压缩 ...
- 数据bus
moo的Hessian总线的数据通信模式大致为: Hessian 格式:基于二进制格式的用于网络传输的协议.Hessian格式数据流的是实现 java.io.Serializable接口.当两个进程在 ...
- [Java面试四]Strust2总结及在面试中的一些问题.
1. JavaEE软件三层结构和MVC的区别? JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层).业务逻辑层.数据持久层.[其中WEB层会使用前端控制器模式] MV ...
- SSH框架详解
1.什么是ssh? SSH对应 struts spring hibernate struts 采用MVC模式,主要是作用于用户交互 spring 采用IOC和AOP~作用比较抽象,是用于项目的松耦合 ...
- 浅谈iOS版本号
作者:Travis FIR.im 一直在尽量兼容不同使用习惯的版本号形式, 但是在使用中我们发现好多开发者对怎么更好的用版本号来标示应用很陌生. 这是篇基础文章, 简单介绍 iOS 的版本号. 名词解 ...
- asp.net 站点重启
有时一些特殊情况需要重启站点,在System.Web.dll程序集下HttpRuntime类下有一个静态方法UnloadAppDomain,使用这个方法可以重启站点: protected void b ...
- css3实现超出文本指定行数(指定文本长度)用省略号代替
测试代码: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...
- EasyUI分页索引不能输入非数字
//分页索引不能输入非数字 function PagerCheck() { $(".pagination-num").keydown(function (event) { even ...
- KnockoutJS 3.X API 第一章 简介
本文纯正翻译自官网API文档.其中包含一下个人理解. 官网API地址:http://knockoutjs.com/documentation/introduction.html 简介 Knockout ...