VS 2012中消失了的Create UnitTest
前言:最近正在研究一个新项目的开发工作,这个项目的要求是必须写UnitTest,对于我个人来讲是很不喜欢写UnitTest的感觉这个东西会很大程度的延误开发进度,所以之前项目的UnitTest是能不写就不写,好在作坊式的开发不在乎你写不写,功能Work就OK了,好多技术大拿都对UnitTest情有独钟,可能对于我这种码农来说无法理解其好处吧,小小抱怨也无力改变什么,只能研究研究UnitTest了。
当我在VS12中想通过右键找到Create UnitTest这个选项的时候,我发现10中给写UnitTest带来极大方便的选项在12 13中竟然没有了(也可见我多久没写UnitTest了lol),为什么微软要将这个功能取消了呢,我个人认为是为了更好的满足TDD的开发模式,微软对于TDD的开发模式可以说是大力的支持,甚至用VS 2012的开发团队为模板来向我们这些屌丝程序员来展示什么是优雅的C#开发。那何为TDD呢,下面切入正题来说说我的一点理解。
TDD(测试驱动开发) 是测试先行的方式,也就是说根据需求写驱动(写测试用例)。通过用例从红灯变成绿灯,使其通过了把实现的代码生成出来。通常我们的开发模式是先写完Code,然后Create UnitTest,此种方式属于测试后行。对于此两种方式,我个人感觉不能说就一定要TDD而完全否定测试后行的方式,但是TDD给我们带来的方便是今天想要谈的主题,对于两种方式的讨论,欢迎大家来辩。
TDD此种方式最有意义的地方在于:不会因为你先去想代码实现而产生过度设计的问题,如果从实际的需求出发,你写出来的代码是最简单,最直接满足需求的方式,就不会产生过度设计的问题。在这里我同样想到了一种编程方式:结对编程,结对编程是一种将知识传播下去的方式,意思是熟悉此处逻辑的老人可以和新人一起来编写一块逻辑,通过去修改BUG,写代码,老人带着新人将这块一起做下来,包括新成员进来的时候可以通过此种方式将知识传播下去。这也是一种Code Review,两个人一起看,总比一个人看发现问题的机会要多一些,因为两个人的思路是不同的,总是一个人开发是有问题的。因此此处是想将结对编程和TDD结合的方式。一个人写Test Case,另一个人通过Test Case来写实现。下面就通过实际的例子来演示一下(演示的代码没有实际意义,只是想通过例子来展示结对编程和TDD结合)。
比如说我们现在有一个需求求一个圆的周长,那我们需要设计两种用例,1、输入一个整数值,通过计算返回周长。2、输入一个负值,抛错。下面我需要两个人来结对通过TDD方式来实现这个Story,为了方便理解,我用大话设计模式的人物命名方式来指定两个开发人员,老鸟,菜鸟。
老鸟:我写一个类Circle,写好它的构造函数。
private int _r;
/// <summary>
/// TODO: Complete member initialization
/// </summary>
/// <param name="p">radius</param>
public Circle(int r)
{
this._r = r;
}
然后我开始写UnitTest,先创建一个UnitTest工程,然后写Test Case,写好后生成Caculate方法,设置断言,想得到正确结果。
[TestMethod]
public void TestPerimeter_FirstCase()
{
Circle worker = new Circle();
double result = worker.Caculate();
Assert.AreEqual(result, 6.28);
}
此时,我Run Test,结果是通不过,因为我的Caculate方法还没有实现,小鸟,那你来实现这个方法。
小鸟:so easy,分分钟搞定。
private int _r;
private readonly double _pi = 3.14 * ; /// <summary>
/// TODO: Complete member initialization
/// </summary>
/// <param name="p">radius</param>
public Circle(int r)
{
this._r = r;
} public double Caculate()
{
return _r * _pi;
}
老鸟:OK,现在我们再Run Test,果然我们这个Case通过了。那我再写一个Test Case。
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void TestPerimeter_SecCase()
{
Circle worker = new Circle(-);
double result = worker.Caculate();
}
再Run Test,又失败了。
小鸟:哦,因为没有对参数进行判断,没有考虑小于零的情况,我修改下Caculate方法的实现。
public double Caculate()
{
if (_r < )
{
throw new ArgumentException();
}
return _r * _pi;
}
这样两种Case就全通过了。
这个小例子就算结束了,可以看出来,我们通过TDD的方式,根据Test Case来设计代码逻辑,可以使我们的逻辑没有任何过度设计,而且这样的方式使UnitTest的代码覆盖率很高。
VS 2012中消失了的Create UnitTest的更多相关文章
- 开始VS 2012中LightSwitch系列的第3部分:我该选择哪一个屏幕模板
[原文发表地址] Beginning LightSwitch in VS 2012 Part 3: Screen Templates, Which One Do I Choose? [原文发表时间] ...
- 开始VS 2012中LightSwitch系列的第5部分:我可以使用用户权限来控制访问权吗?
[原文发表地址] Beginning LightSwitch in VS 2012 Part 5: May I? Controlling Access with User Permissions [ ...
- 在SQL Server 2012中实现CDC for Oracle
在上篇在SSIS 2012中使用CDC(数据变更捕获)中,介绍了如何在SSIS 2012中使用CDC,本文在此基础上介绍,如何通过Attunity提供的Change Data Capture Desi ...
- 在SSIS 2012中使用CDC(数据变更捕获)
最新项目稍有空隙,开始研究SQL Server 2012和2014的一些BI特性,参照(Matt)的一个示例,我们开始体验SSIS中的CDC(Change Data Capture,变更数据捕获). ...
- 在SQL 2012中使用和Oracle 一样的序列
使用过Oracle的都知道,Oracle中的自增是靠序列来完成的,在一定程度上蛮方便的.现在SQL 2012中也有序列了.来看看怎么做的吧! SQL Server 现在将序列当成一个对象来实现,创建一 ...
- SQL Server 2012中快速插入批量数据的示例及疑惑
SQL Server 2008中SQL应用系列--目录索引 今天在做一个案例演示时,在SQL Server 2012中使用Insert语句插入1万条数据,结果遇到了一个奇怪的现象,现将过程分享出来,以 ...
- 如何在Visual Studio 2012中发布Web应用程序时自动混淆Javascript
同Java..NET实现的应用程序类似,Javascript编写的应用程序也面临一个同样的问题:源代码的保护.尽管对大多数Javascript应用公开源代码不算是很严重的问题,但是对于某些开发者来说, ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)
本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)
前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...
随机推荐
- php 正则校验是否是域名
/** * @description 匹配 * t.cn 正确 * t-.cn 错误 * tt.cn正确 * -t.cn 错误 * t-t.cn 正确 * tst-test-tst.cn 正确 * t ...
- Jquery扩展- 倒计时
Source Code (function($) { $.fn.countdown = function(options) { // default options var defaults = { ...
- chapter3:Collaborative Filtering ---------A Programmer's Guide to Data Mining
Implicit rating and item based filtering Explicit rating: 用户明确的对item评分 Implicit rating:反之 明确评分所存在的问题 ...
- Hdu 4311-Meeting point-1 曼哈顿距离,前缀和
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4311 Meeting point-1 Time Limit: 2000/1000 MS (Java/Oth ...
- wxWidgets一个界面与数据分离的简单例子
/*************************************************************** * Name: MyApp.h * Purpose: Defines ...
- linux下avr单片机开发:中断服务程序
不管是什么单片机程序,中断总是非常重要的一部分 ,linux 下的avr开发,主要是依靠avr-gcc,以及avr-libc,它们对中断程序的格式要求,与window下的icc-avr以及win-av ...
- 比較具体的handle机制
Android的消息机制,用Android线程间通信的Message机制,Android中Handler的用法--在子线程中更新界面,handler机制 Android的消息机制(一) android ...
- SCADESuite嵌入式软件基于模型的开发
SCADE Suite®产品是针对高安全性嵌入式软件的基于模型的开发环境 SCADE Suite是高安全性嵌入式软件的开发标准,其应用领域涵盖航空.国防.轨道交通.能源和重工业.专为最高等级的质量和安 ...
- 字符串匹配算法-BM
在用于查找子字符串的算法中,BM(Boyer-Moore)算法是当前有效且应用比较广泛的一种算法,各种文本编辑器的“查找”功能(Ctrl+F),大多采用Boyer-Moore算法.比我们学习的KMP算 ...
- javascript如何列出全局对象的非原生属性。
Why 研究一个网站前端技术的时候,了解它的全局的对象是一个好的入口, 一般来说,常见的库就会用外观模式,最后暴露一个对象给用户调用, 比如jQuery,requirejs,angular,react ...