写在开头:Coding ain't done until all the tests run. No unit test no BB.

-------------------------------------------------------------

本文主要介绍如何在Visual Studio(2012+)下面做单元测试。主要以下内容:

  1. 单元测试介绍
  2. 单元测试的基本特点
  3. 使用VS Stub进行单元测试

单元测试介绍

测试类型很多,单元测试是开发人员使用程序自动测试自己的代码,用一张图说明:

上面的method代表的是一个独立的逻辑,并不是说所有的方法都需要测试,比如私有方法,他应该属于其他的独立逻辑,可以通过其他的方法就行测试

单元测试是代码质量的强有力的保证,是重构代码的信心保障,好的单元测试个人认为应该有以下的特点:

  1. 运行速度要快,如果你的测试运行需要一整天,以后肯定不愿意写case,也不愿意再运行和维护
  2. 测试case应该互相不依赖,不要出现运行A case 先得运行B case的情况
  3. 测试case不应该依赖外部资源,比如service,DB,应该随时都可以运行(比如断网)
  4. 单元测试应该和生产代码一样重要,要随着代码的维护而维护

在VS中使用Stub特性进行单元测试:

1. 先写一段用于测试的代码

一个用于发送email的接口

   /// <summary>
    /// interface of email handler
    /// </summary>
    public interface IEmail
    {
        bool SendEmail(string reveiver, string emailBody, string subject);
    }

Email发送的实现,调用Email service发送邮件

    /// <summary>
    /// real email handler
    /// </summary>
    class EmailImp : IEmail
    {
        public bool SendEmail(string reveiver, string emailBody, string subject)
        {
            //call email remote service here to send email
            return true;
        }
    }

业务通知类,调用EmailImp发送邮件,发送成功,返回1,失败返回0,当然真正的业务肯定要做其他事情。

 public class Notifier
    {
        public IEmail EmailHandler { get; set; }

        public Notifier()
        {
            this.EmailHandler = new EmailImp();
        }

        public int Notify()
        {
            var sendResult = this.EmailHandler.SendEmail("ut@cnblogs.com", "email body", "emailSubject");
            if (sendResult)
            {
                ;
            }
            else
            {
                ;
            }
        }
    }

2. 现在要测试Notify方法,简单的步骤,生成测试solution和基本测试代码:

3. 上面的Notify至少应该对应两个Case:

  1. 当Email Service返回true
  2. 当Emial Service返回false

上面说到,单元测试不应该依赖于外部Service,DB.等。但是程序一般肯定依赖这些。如果这些外部Service down了。DBdown了。程序怎么测试。在测试的时候如何控制Email Service 按照我们的需要来返回True、False。这就是Stub要解决的问题。Stub是存根打桩的意思,打桩是测试里面很重要的一个概念。

4. VS可以通过增加Fake程序集来完成对程序的Stub:

5. 增加fake程序集之后就可以看到:

6. 接下来sub的使用,直接通过代码来展示

上面的例子很清楚,两个case完全不依赖于外部email service。随心所欲的指定email service 的返回值,从而很轻松的验证了我们自己的逻辑。

Stub主要思想就是在运行时针对接口动态注入,动态的用我们指定的Stub类来替换真正的执行类来完成我们指定的功能。

想通过Stub进行测试,被Fake的对象必须基于接口编程。

当然基于接口编程,上面的Stub程序员也可以自己实现,何必呢,VS已经帮我们实现了。

那问题来了。如果代码没有基于接口进行编程,怎么办?是不是没有办法像Stub这么进行替换模拟呢。下一篇文章再介绍另外一个功能:Shim.

使用Visual Studio进行单元测试-Part1的更多相关文章

  1. 【MVC 4】4.MVC 基本工具(Visual Studio 的单元测试、使用Moq)

     作者:[美]Adam Freeman      来源:<精通ASP.NET MVC 4> 3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本 ...

  2. [转]Visual Studio 2010 单元测试目录

    Visual Studio 2010 单元测试共分七个部分: 普通单元测试.顺序单元测试.压力测试,Generic测试.数据库测试.UI界面测试和Web性能测试. 这个系列的博客实例程序可以在下面的链 ...

  3. 使用Visual Studio进行单元测试

    一.使用Visual Studio进行单元测试的几个建议 1.先写单元测试(依我愚见,应该是接口先行,如果有的话) -> 测试失败 -> 以最小的改动(即编写实际代码)使测试通过(而在VS ...

  4. Visual Studio 2010 单元测试目录

    单元测试的重要性这里我就不多说了,以前大家一直使用NUnit来进行单元测试,其实早在Visual Studio 2005里面,微软就已经集成了一个叫Test的专门测试插件,经过几年的发展,这个工具现在 ...

  5. Visual Studio 2010 单元测试之一---普通单元测试

    原文:Visual Studio 2010 单元测试之一---普通单元测试 本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试. 首先来介绍普通单元 ...

  6. Visual Studio 2010 单元测试--运行测试并查看代码覆盖率

    原文:Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试 ...

  7. MVC 基本工具(Visual Studio 的单元测试、使用Moq)

    3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本文打算使用 Visual Studio 附带的内建单元测试支持,但其他一些.NET单元测试包也是可用的. ...

  8. [转]Visual Studio 2010单元测试(2)--运行测试并查看代码覆盖率

    Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试并查看 ...

  9. C# Note31: 如何使用Visual Studio做单元测试

    待更! 使用Visual Studio 2013进行单元测试--初级篇 带你玩转Visual Studio——单元测试(C++例)

随机推荐

  1. 【BZOJ1007】[HNOI2008]水平可见直线 半平面交

    [BZOJ1007][HNOI2008]水平可见直线 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见 ...

  2. VS2010 fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改 ...

  3. Pairs of Integers

    Pairs of Integers You are to find all pairs of integers such that their sum is equal to the given in ...

  4. JAVA NIO 简介 (netty源码死磕1.1)

    [基础篇]netty 源码死磕1.1:  JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/ ...

  5. springboot错误页面处理

    springboot作为微服务的便捷框架,在错误页面处理上也有了一些新的处理,不同于之前的pringmvc500的页面处理是比较简单的,用java config或者xml的形式,定义如下的Bean即可 ...

  6. Docker学习总结之docker创建私有仓库(private Repositories)

    Docker 创建 Private Repositories 前言 基于GFW的缘故,国内大陆基本无法pull国外的镜像,更别说官方的index了.如果images无法pull下来,那么docker就 ...

  7. ALV 红绿灯编写

    [转http://lz357502668.blog.163.com/blog/static/164967432012417102133216/]ALV 指示燈 編寫 1,在內表中申請一個字段. 該字段 ...

  8. IDEA main方法自动补全(转发:http://blog.csdn.net/zjx86320/article/details/52684601)

    最近刚从Eclipse转到IDEA,各种学习丫,IDEA里的main方法是不能自动补齐的,肿么办呢? 1.首先,点击File-->Settings-->Editor-->Live T ...

  9. 免费好用的Diff和Merge工具大总结

    总结:比较下来:diffmerge和P4merge最好用,kdiff比较专业些,支持自动merge. 一 csdiff 下载:http://www.componentsoftware.com/Prod ...

  10. python基础10 ---匿名函数和递归

    一.匿名函数 1.lambda表达式就相当于匿名函数,其格式为: lambda 参数列表:参数表达式 2.lambda自带return值,因为匿名函数有个限制,就是只能有一个表达式,不用写return ...