NUnit3 Test Adapter vs2015

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,只是略做了些修改以便于展现两者的特点):

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

展开

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

Moq 4.0 Rhino Mocks 3.6
[Test]
public void TestPresenterSelection() {
    // arrange
    var mView = new Mock<IOrdersView>();
    var mRepository = new Mock<IRepository<Order>>();
    var presenter = new OrdersPresenter(mView.Object, mRepository.Object);
    // check that the presenter has no selection by default
    Assert.Null(presenter.SelectedOrder);

    // raise event
    mView.Raise(io => io.OrderSelected += null,
        new OrderEventArgs { Order = new Order("moq", 50) });

    // assert
    Assert.NotNull(presenter.SelectedOrder);
    Assert.AreEqual("moq", presenter.SelectedOrder.ProductName);
}
[Test]
public void TestPresenterSelection() {
    // arrange
    var mView = MockRepository.GenerateMock<IOrdersView>();
    var mRepository = MockRepository.GenerateMock<IRepository<Order>>();
    var presenter = new OrdersPresenter(mView, mRepository);
    // check that the presenter has no selection by default
    Assert.Null(presenter.SelectedOrder);

    // raise event
    mView.Raise(io => io.OrderSelected += null, null,
        new OrderEventArgs { Order = new Order("moq", 50) });

    // assert
    Assert.NotNull(presenter.SelectedOrder);
    Assert.AreEqual("moq", presenter.SelectedOrder.ProductName);
}
[Test]
public void TestRetrieveOrders() {
    // arrange
    var mView = new Mock<IOrdersView>();
    var mRepository = new Mock<IRepository<Order>>();
    var presenter = new OrdersPresenter(mView.Object, mRepository.Object);

    List<Order> defaultOrders = new List<Order>
        { new Order("moq"), new Order("RhinoMock") };

    mRepository.Setup(r => r.FindAll()).Returns(defaultOrders);

    // exercise mocks
    presenter.OnInit();
    // assert
    mView.VerifySet(v => v.Orders = defaultOrders);
}
[Test]
public void TestRetrieveOrders() {
    // arrange
    var mView = MockRepository.GenerateMock<IOrdersView>();
    var mRepository = MockRepository.GenerateStub<IRepository<Order>>();
    var presenter = new OrdersPresenter(mView, mRepository);

    List<Order> defaultOrders = new List<Order>
        { new Order("moq"), new Order("RhinoMock") };

    mRepository.Stub(ir => ir.FindAll()).Return(defaultOrders);

    // exercise mocks
    presenter.OnInit();
    // assert
    mView.AssertWasCalled(v => v.Orders = defaultOrders);
}

Conclusion

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

References

  1. QuickStart - Moq
  2. [email protected] - Rhino Mocks 3.5
  3. Daniel Cazzulino‘s Blog - Why do we need yet another NET mocking framework

分类: C#

时间: 2024-10-14 14:19:23

NUnit3 Test Adapter vs2015的相关文章

NUnit.Framework在VS2015中如何进行单元测试

微软在VS2015中加入了自动化生成测试功能, 在需要测试的源文件的公共方法中右键既可以创建单元测试. 不过需要注意的是,要在公共方法中创建,否则会提示这个错误 如下是自动化单元测试界面,可以发现在VS2015中,开放了对扩展单元测试的支持,如果你有自己安装的扩展单元测试,那么就会在生成自动化测试这里显示 下面来进入主题,如果进行NUnit单元测试 NUnit当前可以在VS2015中安装第2版和第3版,很多人没有测试成功很大一个原因是安装的版本不对应. 先讲解如果给项目添加NUnit单元测试的支

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

刚装的vs2015 社区版 出现这个问题,wp8.1和win10m模拟器都无法启动,找了好久找到的解决方案,放这儿供大家参考,免得大家像我一样走弯路: Windows Phone emulator not starting (couldn`t setup the UDP port) After updating Windows 10 to build 10061 windows phone emulators (all 8.1 and 10) stopped starting. I get th

VS2013 VS2015 VS2017调试出现无法启动iis express web服务器

最近老是遇到这个问题,天天如此,烦死人,网上答案繁多,但是都解决不了,也是由于各种环境不同导致的,这里把几种解决方法都记录下 一.其他项目都可以,就这么一个不行 因为其他项目都可以,就这么一个不行,所以基本就是配置问题,网上的办法都试了,我试了都没用,现在说说我的解决办法 用记事本或者其他什么文本编辑器,打开项目的.csproj文件,定位到<WebProjectProperties>,把关于IIS的配置<DevelopmentServerPort>.<DevelopmentS

QT5.6.0+VS2015编译MQSQL(ACCESS)X64数据库驱动

QT5.6.0+VS2015编译MQSQL(ACCESS)数据库驱动 1 说明 l 不建议QT5.6.0使用ACCESS数据库.如果想使用轻量级的数据库,可以使用Sqlite数据库. QT想要访问Access.SQL Server等数据库可以通过ODBC的方式来访问,但是QT较高版本已不提供ODBC驱动库,需要自己编译.QT5.6.0编译出来的数据库驱动是64位,但是不建议安装Access数据库,微软本身也不建议安装64位office. PS:为什么QT5.6.0不编译32位数据库驱动:编译数据

Android开发--Adapter的应用

1.简介 Adapter的作用是为GridView,ListView等界面控件与数据之间搭建桥梁,每当列表里的每一项显示到页面时,都会调用到Adapter的getView方法 返回一个View.在Android API中内置了几个实现ListAdapter的Adapter,它们分别为BaseAdapter,SimpleAdapter(以Map形式存储静态数据), SimpleCursorAdapter.Adapter,数据和UI三者关系如下: 2.BaseAdapter 自定义BaseAdapt

设计模式之Adapter(适配器)(转)

定义: 将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用? 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口. 怎么办? 使用Adapter,在这两种接口之间创建一个混合接口(混血儿). 如何使用? 实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两

VS2015 C#的单元测试

1.安装visual studio 2015过程 visual studio 会对windows系统兼容性有很高的要求,没有达到win7 sp1以上的就不给安装,贴一张官方的系统的要求吧. 很不幸的是,我的就是windows 7纯净版就是没有安装任何补丁,是的没有打一个补丁,我把update 自动更新关了.第一次尝试的时候我当然是选择简单的装啊,把sp1补丁给装上,万万没有想到的是更新失败了,我也不知道为什么.然后进过我的抉择只能把系统换了装了个win10,不过唯一的好处是感觉装了系统后网速变快

适配器模式(Adapter)

1.定义: 适配器模式是将一个类的接口转换成客户端希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 结构与说明: Client:客户端,调用自己需要的领域接口Target. Target:定义客户端需要的跟特定领域相关的接口. Adaptee:已经存在的接口,但与客户端需要的特定领域接口不一致,需要被适配. Adapter:适配器,把Adaptee适配成Client需要的Target. 2.代码示例 (1)已经存在的应用接口,需要被适配的类Adaptee 1

Android中适用于ListView、GridView等组件的通用Adapter

今天随便逛逛CSDN,看到主页上推荐了一篇文章Android 快速开发系列 打造万能的ListView GridView 适配器,刚好这两天写项目自己也封装了类似的CommonAdapter,以前也在github上看到过这样的库,于是自己也把自己的代码再次整理出来与大家分享,也希望能够在CSDN这个平台上学到更多的东西,下面就一起来看看吧. 平时我们在项目中使用到ListView和GridView组件都是都会用到Adapter,比较多的情况是继承自BaseAdapter,然后实现getCount