• Unit Test Via Visual Studio


    转载Unit Test Via Visual Studio-Part1

    写在开头: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)
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
        }
    复制代码

    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.

     
    分类: 单元测试
    标签: 单元测试
  • 相关阅读:
    平时代码中用不到设计模式?Are you kidding me?
    关于kubernetes我们还有什么可做的?
    R语言︱文本挖掘——词云wordcloud2包
    描述性统计分析-用脚本将统计量函数批量化&分步骤逐一写出
    R语言读写中文编码方式
    R画图中英文字体完美解决方案
    Python 和 R 数据分析/挖掘工具互查
    关于ř与tableau的集成---- k均值聚类
    tableau 连接R语言
    小识Tableau
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4471076.html
Copyright © 2020-2023  润新知