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+)下面做单元测试。主要以下内容:
- 单元测试介绍
- 单元测试的基本特点
- 使用VS Stub进行单元测试
单元测试介绍
测试类型很多,单元测试是开发人员使用程序自动测试自己的代码,用一张图说明:
上面的method代表的是一个独立的逻辑,并不是说所有的方法都需要测试,比如私有方法,他应该属于其他的独立逻辑,可以通过其他的方法就行测试
单元测试是代码质量的强有力的保证,是重构代码的信心保障,好的单元测试个人认为应该有以下的特点:
- 运行速度要快,如果你的测试运行需要一整天,以后肯定不愿意写case,也不愿意再运行和维护
- 测试case应该互相不依赖,不要出现运行A case 先得运行B case的情况
- 测试case不应该依赖外部资源,比如service,DB,应该随时都可以运行(比如断网)
- 单元测试应该和生产代码一样重要,要随着代码的维护而维护
在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:
- 当Email Service返回true
- 当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.
Unit Test Via Visual Studio的更多相关文章
- [Visual Studio] 开启Visual Studio 2012通过右键菜单创建单元测试(Unit Test)
Visual Studio 2012可以说是迄今为止微软VS开发工具中用户体验最好的产品,无论是速度还是体验以及功能,都非常出色,但是,使用了一段时间后发现有一个之前版本VS都有的功能却在Visual ...
- Visual Studio 中的单元测试 UNIT TEST
原文:Visual Studio 中的单元测试 UNIT TEST 注:本文系作者原创,可随意转载,但请注明出处.如实在不愿注明可留空,强烈反对更改原创出处.TDD(Test-Driven Devel ...
- Visual Studio Code Unit Testing
1.NUnit project.json { "version": "1.0.0-*", "testRunner": "nunit ...
- Xamarin+Prism开发详解三:Visual studio 2017 RC初体验
Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...
- [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)
[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date 周六 10 一月 2015 By 钟谢伟 Category website develop ...
- Apworks框架实战(四):使用Visual Studio开发面向经典分层架构的应用程序:从EasyMemo案例开始
时隔一年,继续我们的Apworks框架之旅.在接下来的文章中,我将逐渐向大家介绍如何在Visual Studio中结合Apworks框架,使用ASP.NET Web API和MVC来开发面向经典分层架 ...
- Visual Studio “14” CTP 4
微软发布于10月6日发布了Visual Studio "14"CTP 4,本次发布的更新主要包括:ASP.NET vNext runtime和一些工具的优化(ASP.NET vNe ...
- Visual Studio 2015 开发 ASP.NET 5 有何变化?
本篇博文目录: ASP.NET 5 模版 ASP.NET 5 目录结构 前端管理工具 无编译开发 Microsoft Git Provider 智能感知和错误信息 Smart Unit Testing ...
- 软件工程-构建之法 Visual Studio开发平台的安装与单元测试
一.前言 自从开始了大三下的生活,学校开设一门课程“软件工程”,刚好我们是第一届进行课程改革,不在像以前那样背背概念,考前进行好好突击,然后考试就能过,最后毕业了发现软件工程课程到底我们在其中学习了什 ...
随机推荐
- Android访问设置
在需求 AndroidManifest.xml 中增加下面代码: (1)假设应用程序须要訪问网络权限 <uses-permission android:name="android.pe ...
- Multicast on Openstack
I test multicast on openstack. I use external Router in this test. Openstack Environment: Havana (ML ...
- hdoj 2183 奇数阶魔方(II) 【模拟】+【法】
比赛的时候花了一个多小时,以做不做 分析:可观察:中间是(n*n+1)/2, 中间的上面是n*n,以下是1, 左边是n,右面是(n*n+1)-n,并且正对角线是最左上对到最右下端添加(+1).另外一条 ...
- Objective-c正确的写法单身
Singleton模式iOS发展可能是其中最常用的模式中使用的.但是因为oc语言特性本身,想要写一个正确的Singleton模式是比较繁琐,iOS中单例模式的设计思路. 关于单例模式很多其它的介绍请參 ...
- PE文件结构(四) 输出表
PE文件结构(四) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 输出表 一般来说输出表存在于dll中.输出表提供了 文件里函数的名字跟这些函数的地址, PE装载器通过输出表来改 ...
- WPF学习(10)模板
在前面一篇我们粗略说了Style和Behaviors,如果要自定义一个个性十足的控件,仅仅用Style和Behaviors是不行的,Style和Behaviors只能通过控件的既有属性来简单改变外观, ...
- Android高级编程笔记(四)深入探讨Activity(转)
在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...
- HTTP 请求报文 响应报文(转)
引言 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发 ...
- unity3D实际的原始视频游戏开发系列讲座10它《战斗:外来入侵》在第一季度游戏开发
解说文件夹 <保卫战:异形入侵>游戏开发 第一讲 游戏演示和资源的介绍 第二讲 "异形"怪物的实现 第三讲 "异形"怪物生命值的体现 第四讲 ...
- MEF实现设计上的“松耦合”
C#进阶系列——MEF实现设计上的“松耦合”(二) 前言:前篇 C#进阶系列——MEF实现设计上的“松耦合”(一) 介绍了下MEF的基础用法,让我们对MEF有了一个抽象的认识.当然MEF的用法可能 ...