zoukankan      html  css  js  c++  java
  • NUnit3 Test Adapter vs2015

    NUnit的安装

    前言:NUnit是什么?

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

    一、NUnit的安装

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

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

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

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

    1NUnit GUI

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

            

    2NUnit的命令行

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

             

    3Visual Studio的插件Nunit Test Adapter(这个也就是VSNUnit的整合啦)

    其实本人更加偏爱这一种,不需要像前两个,每次都要打开两个窗口,而这个,我们只需要安装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,只是略做了些修改以便于展现两者的特点):

    mocks 

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

    展开

    下面是用这两个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. Ayende@Wiki - Rhino Mocks 3.5
    3. Daniel Cazzulino's Blog - Why do we need yet another NET mocking framework
     
    分类: C#
  • 相关阅读:
    js总结(10)js获取当前域名、Url、相对路径和参数以及指定参数
    php 总结(1) 服务器环境疑难问题整理
    File "/bin/yum", line 30 except KeyboardInterrupt, e: SyntaxError: invalid syntax 报错的解决
    批处理的个人日常使用集锦(持续更新)
    tomcat后台弱口令
    php一句话图片马上传绕过
    linux口令文件shadow加密复现
    linux系统使用screen工具恢复断开的会话
    snmp协议漏洞的msf利用
    Vulnhub靶场presidential1靶场
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4922922.html
Copyright © 2011-2022 走看看