NUnit的安装

前言:NUnit是什么?

NUnit 是一个单元测试框架,专门针对于.NET来写的。NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等。最重要的一点是它适合于所有.NET语言。

一、NUnit的安装

1、下载NUnit(NUnit-2.6.4.msi),双击点击安装直到完成。

值得提醒的一点是,如果我们要写测试的类,需要引用nunit.framework

二、查看测试结果(推荐安装插件)

一般情况下,我们运行测试后想要看到结果情况,主要是通过三种方法:

1、NUnit GUI

这个是NUnit安装完成之后的客户端,图中是它的界面,我们通过加载程序的dll或者程序集来运行测试类,查看测试情况和结果。

2、NUnit的命令行

就是用shell(图形界面的shell)来进行测试的相关事宜,在这里我们需要设置环境变量(在Path路径下添加NUnit的安装路径C:\ProgramFiles (x86)\NUnit 2.6.4\bin)

3、Visual Studio的插件Nunit Test Adapter(这个也就是VS与NUnit的整合啦)

其实本人更加偏爱这一种,不需要像前两个,每次都要打开两个窗口,而这个,我们只需要安装NUnit的一个插件,就可以在直接在VS中执行测试并且看到测试结果,如图所示。

插件的安装:在VS的工具栏中→工具→扩展和更新(U)→在弹出的框中,最左边选择“联机”,然后在搜索框中输入关键字“nunit”,查出“Nunit3 Test Adapter或Nunit Test Adapter”,点击安装即可。

Moq & RhinoMocks

使用Mock对象进行测试一般都会有以下三个关键步骤:

  1. 使用接口来描述需要测试的对象
  2. 为实际的产品代码实现这个接口
  3. 以测试为目的,在Mock对象中实现这个接口

在使用Mock对象的过程中,充分体现出了“面向接口编程”的设计原则,同时也促成类的良好设计。

自行实现Mock对象是相当繁琐的工作,让人幸运的是,在.NET世界中有多个优秀的Mock框架可以供大家选择,目前最常使用的无非MoqRhino Mocks这两个框架。两者的最新版本在Mocking API方面的用法已日趋一致,都依托Lambda表达式、泛型和扩展方法做了很大改进,目标都是让Mock对象以一种更自然的方式与多个单元测试框架进行集成,以一种清晰的语法来描述期望值、参数约束、返回值等,极大的方便开发者的使用。

由于Moq和Rhino Mocks都使用了Castle DynamicProxy这个类库动态生成代理类,因此对需要Mock的对象有一定的限制:所测试的方法必须是virtual类型。

下面就用一个例子来看看两者的不同实现(这个例子摘自Moq源代码包中的Samples,只是略做了些修改以便于展现两者的特点):

需要进行测试的对象如下示之:

  1. 展开

下面是用这两个Mock框架分别实现的单元测试代码:

Moq 4.0 Rhino Mocks 3.6
  1. [Test]
  2. public void TestPresenterSelection() {
  3. // arrange
  4. var mView = new Mock<IOrdersView>();
  5. var mRepository = new Mock<IRepository<Order>>();
  6. var presenter = new OrdersPresenter(mView.Object, mRepository.Object);
  7. // check that the presenter has no selection by default
  8. Assert.Null(presenter.SelectedOrder);
  9.  
  10. // raise event
  11. mView.Raise(io => io.OrderSelected += null,
  12. new OrderEventArgs { Order = new Order("moq", 50) });
  13.  
  14. // assert
  15. Assert.NotNull(presenter.SelectedOrder);
  16. Assert.AreEqual("moq", presenter.SelectedOrder.ProductName);
  17. }
  1. [Test]
  2. public void TestPresenterSelection() {
  3. // arrange
  4. var mView = MockRepository.GenerateMock<IOrdersView>();
  5. var mRepository = MockRepository.GenerateMock<IRepository<Order>>();
  6. var presenter = new OrdersPresenter(mView, mRepository);
  7. // check that the presenter has no selection by default
  8. Assert.Null(presenter.SelectedOrder);
  9.  
  10. // raise event
  11. mView.Raise(io => io.OrderSelected += null, null,
  12. new OrderEventArgs { Order = new Order("moq", 50) });
  13.  
  14. // assert
  15. Assert.NotNull(presenter.SelectedOrder);
  16. Assert.AreEqual("moq", presenter.SelectedOrder.ProductName);
  17. }
  1. [Test]
  2. public void TestRetrieveOrders() {
  3. // arrange
  4. var mView = new Mock<IOrdersView>();
  5. var mRepository = new Mock<IRepository<Order>>();
  6. var presenter = new OrdersPresenter(mView.Object, mRepository.Object);
  7.  
  8. List<Order> defaultOrders = new List<Order>
  9. { new Order("moq"), new Order("RhinoMock") };
  10.  
  11. mRepository.Setup(r => r.FindAll()).Returns(defaultOrders);
  12.  
  13. // exercise mocks
  14. presenter.OnInit();
  15. // assert
  16. mView.VerifySet(v => v.Orders = defaultOrders);
  17. }
  1. [Test]
  2. public void TestRetrieveOrders() {
  3. // arrange
  4. var mView = MockRepository.GenerateMock<IOrdersView>();
  5. var mRepository = MockRepository.GenerateStub<IRepository<Order>>();
  6. var presenter = new OrdersPresenter(mView, mRepository);
  7.  
  8. List<Order> defaultOrders = new List<Order>
  9. { new Order("moq"), new Order("RhinoMock") };
  10.  
  11. mRepository.Stub(ir => ir.FindAll()).Return(defaultOrders);
  12.  
  13. // exercise mocks
  14. presenter.OnInit();
  15. // assert
  16. mView.AssertWasCalled(v => v.Orders = defaultOrders);
  17. }

Conclusion

通过上面的实例我们可以很容易看出两者的Syntax与API都非常接近,使用两者任何一个都能方便实现你的测试目的。

References

  1. QuickStart - Moq
  2. Ayende@Wiki - Rhino Mocks 3.5
  3. Daniel Cazzulino's Blog - Why do we need yet another NET mocking framework
 
分类: C#

NUnit3 Test Adapter vs2015的更多相关文章

  1. VS2013单元测试 的安装、创建与执行

    1.要运行 vs2013单元测试 ,那么打开VS2013,选择工具-扩展和更新,搜索并安装Unit Test Generator. 如果不安装是不会出现Generate Unit Test的选项的,也 ...

  2. Vs2015 win10虚拟机启动问题:无法设置UDP端口 解决方法 合集(转载)

    刚装的vs2015 社区版 出现这个问题,wp8.1和win10m模拟器都无法启动,找了好久找到的解决方案,放这儿供大家参考,免得大家像我一样走弯路: Windows Phone emulator n ...

  3. C# vs2015单元测试测试资源管理器不显示测试方法

    问题描述:在用VS2015用测试框架NUnit单元测试的时候,测试资源管理器死活不出现测试方法,无法运行单元测试模块 现象如下图: 原因:nunit版本不对应 解决方案:下载nunit3.0及往上的版 ...

  4. 关于VS2015 ASP.NET MVC添加控制器的时候报错

    调试环境:VS2015 数据库Mysql  WIN10 在调试过程中出现类似下两图的同学们,注意啦. 其实也是在学习的过程中遇到这个问题的,找了很多资料都没有正面的解决添加控制器的时候报错的问题,还是 ...

  5. VS2015墙内创建ionic2 【利用nrm更换源,完美!】

    STEP 1 设置cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org   一句话建立cnpm STEP 2 安装nr ...

  6. VS2015 Git 源码管理工具简单入门

    1.VS Git插件 1.1 环境 VS2015+GitLab 1.2 Git操作过程图解 1.3 常见名词解释 拉取(Pull):将远程版本库合并到本地版本库,相当于(Fetch+Meger) 获取 ...

  7. 关于VS2015支持编译Linux程序的问题

    现状 目前已经发布的VS2015中包括VS2015 Preview 以及 VS2015 CTP6,这两个版本均不支持直接编译C++代码为Linux程序,具体情况可以参考 Visual Studio 2 ...

  8. VS2015企业版本(安装包+key)+ .NET Reflector 9.0

    Reflector9.0系下载:https://yunpan.cn/cMQj9zWbffSqy  访问密码 55eb VS2015中文企业版: http://pan.baidu.com/s/1eRIo ...

  9. 设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)

    在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...

随机推荐

  1. Netbeans源代码编辑技巧——使用代码补全和代码生成

    原文 Netbeans源代码编辑技巧——使用代码补全和代码生成 使用代码补全生成代码 一般来说,代码补全对于自动填充缺失的代码是有帮助的,例如标识符和关键字.截至 NetBeans IDE 6.0,您 ...

  2. orcl 删除重复的行

    delete from FOODDETAIL t where t.id in (select   t.id from FOODDETAIL where t.sendtime>=to_date(' ...

  3. 怎样在C++中获得完整的类型名称

    Wrote by mutouyun. (http://darkc.at/cxx-get-the-name-of-the-given-type/) 地球人都知道C++里有一个typeid操作符能够用来获 ...

  4. AS3.0下去除flash右键菜单

    这两天工作中遇到一个问题,就是网页中内嵌的flash小游戏的用户体验,当鼠标在flash上点击右键时,出现的右键菜单中会有播放,停止等选项,虽然不会造成什么漏洞,但是体验非常差.在寻找解决方案的时候, ...

  5. Javascript Base64编码与解码

    原文:[转]Javascript Base64编码与解码 <html> <head> <META HTTP-EQUIV="MSThemeCompatible&q ...

  6. Linux查看连接数,并发数

    Linux查看连接数,并发数 博客分类: 小记 linux  软连接 ln -s /home/ictfmcg/data/photo /var/jtnd/data/photo tomcat 6的Conn ...

  7. in与exist , not in与not exist 的区别(转)

    in和exists  in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的.  如果查询的 ...

  8. 利用Sambaserver在Ubuntu系统和Win7系统间共享目录

    1 介绍 如今是网络化的时代,我们每一个人要更好的发展.离不开网络化.信息化的支持.利用网络的支持.在不同的操作系统间共享文件等信息,是计算机专业学生必备的一项技能. 本文所讲的就是怎样建立.设置.链 ...

  9. w7关闭休眠增加C盘容量

    http://jingyan.baidu.com/article/f3ad7d0fc0992e09c2345b51.html powercfg -h off,即可关闭休眠功能 powercfg -h ...

  10. SlopOne推荐算法

    在开源框架taste中有SlopOne的Java实现,效果不错.使用movielens的数据,代码例如以下 代码 #coding:utf-8 import re import math #读取数据,并 ...