写在开头: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. linux nginx完全卸载

        Nginx虽然好用,但是一旦关键配置文件被修改,想要卸载重装却是相当困难.本人因为采用apt-get方式安装后又源码安装了Nginx,结果出现冲 突,卸载不了,安装不上,很是蛋疼.主要的问题还 ...

  2. MyEclipse2014新增bug,尝鲜的朋友需注意NotFoundException: org.springframework.web.context.ContextLoaderListener

    事实上标题后面加上这个异常信息并不合适,可是为了方便和我遇到相同问题的童鞋搜到这篇文章.我不得不这样写啦. 这个异常和你的程序没有关系,假设你没有忘记增加spring Jar包的话,这是fucking ...

  3. SAP初始账号

     方法1:有其中某Client的登录帐号1. 用已有帐号登录某个Client2. 运行Tcode SE303. 单击“tips and tricks“按钮4. 在Performance Tips an ...

  4. Jquery定义对象( 闭包)

    转自:http://www.cnblogs.com/springsnow/archive/2010/06/03/1750832.html 例一:添加对象的静态属性 声明一个对象$.problemWo, ...

  5. (转)ubuntu 12.04搭建Adobe Flash Media Server服务

    破解版传送门:http://fms45.cuplayer.com/fms4download.html 福利:1462-5247-1705-7678-8379-5590 下载解压 cd进目录,./ins ...

  6. 请简单介绍一下Spring

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...

  7. rails 命名

    1.model rails g model wordSetting model:WordSetting has_many: word_settings table: word_settings vie ...

  8. windows与VMware ubuntu虚拟机实现文件共享

    本文基本摘自:无限挑战者的博客 本人用的系统是win10系统,应该区别不大,实现的是win10系统和VMWare虚拟机Ubantu系统之间的文件共享.到网上找了很多的方法各种各样的方式,由于对Linu ...

  9. python字符串格式和编码与解码问题

    %c 转换成字符(ASCII码值,长度为一的字符串) %r 有线使用repr()函数进行字符串转换 %s 有线使用str()函数进行字符串转换 %d or %i 转换成有符号十进制数 %u 转换成无符 ...

  10. Vue-Quill-Editor回显不显示空格的处理办法

    我自己在用VUE做一个博客网站,查了一下好多人都在用Vue-Quill-Editor,于是我也把这个插件加入到我的程序里,可是后来却出现了个问题,如图: 简单的代码如下: <template&g ...