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(1);
double result = worker.Caculate();
Assert.AreEqual(result, 6.28);
}

此时,我Run Test,结果是通不过,因为我的Caculate方法还没有实现,小鸟,那你来实现这个方法。

小鸟:so easy,分分钟搞定。


        private int _r;
private readonly double _pi = 3.14 * 2;

/// <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(-1);
double result = worker.Caculate();
}

再Run Test,又失败了。

小鸟:哦,因为没有对参数进行判断,没有考虑小于零的情况,我修改下Caculate方法的实现。


        public double Caculate()
{
if (_r < 0)
{
throw new ArgumentException();
}
return _r * _pi;
}

这样两种Case就全通过了。

这个小例子就算结束了,可以看出来,我们通过TDD的方式,根据Test
Case来设计代码逻辑,可以使我们的逻辑没有任何过度设计,而且这样的方式使UnitTest的代码覆盖率很高。

时间: 2024-10-25 20:51:38

VS 2012中消失了的Create UnitTest的相关文章

SQL Server 2012中快速插入批量数据的示例及疑惑

SQL Server 2008中SQL应用系列--目录索引 今天在做一个案例演示时,在SQL Server 2012中使用Insert语句插入1万条数据,结果遇到了一个奇怪的现象,现将过程分享出来,以供有兴趣的同学参考. 附:我的测试环境为:SQL Server 2012,命名实例 Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86) Feb 10 2012 19:13:17 Copyright (c) Microsoft Corporatio

在SSIS 2012中使用CDC(数据变更捕获)

最新项目稍有空隙,开始研究SQL Server 2012和2014的一些BI特性,参照(Matt)的一个示例,我们开始体验SSIS中的CDC(Change Data Capture,变更数据捕获). 注:如果需要了解关于SQL Server 2008中的CDC,请看这里http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html),本文假定读者对CDC的工作方式已有所了解.^_^. 我们分三步完成实例: 1.准备基础数据: 2.设

在SQL Server 2012中实现CDC for Oracle

在上篇在SSIS 2012中使用CDC(数据变更捕获)中,介绍了怎样在SSIS 2012中使用CDC,本文在此基础上介绍.怎样通过Attunity提供的Change Data Capture Designer for Oracle实现对Oracle数据表的变更捕获. 相同须要做一些准备工作: 1.配置Oracle数据库为归档模式.并获取浏览日志的指定权限. /* -- ============================================= -- 改动Oracle属性 ---G

Windows Server 2012中的多元密策略

在Windows Server 2008就已经可以使用多元密码策略的,但使用起来很不方便,但到了Windows Server 2012中就简单多了,至于什么是多元密码策略以及在Windows Server 2008中怎么使用大家可以可以去看看我以前的博客:http://yupeizhi.blog.51cto.com/3157367/1549873 1.新建两个测试用户"test1"和"test2": 2.打开"Active Directory 管理中心&q

在Windows Server 2012 中安装 .NET 3.5 Framework

问题 如今,仍然有许多程序和应用需要依靠.NET 3.5 framework 来运行.在Windows Server 2012中,微软提供了.NET 3.5 和.NET 4.5的安装选项以为你的应用程序提供支持.但在安装.NET 3.5 组件时,你要多注意一些细节. 当使用服务器管理器来安装.NET 3.5 时你可能会遇到下面的提示信息,指出源文件无法找到: 即使使用PowerShell来安装,你也可能看到类似的提示信息"The source files could not be downloa

在Win Server 2012中安装.NET Framework 3.5的问题

在Windows Server 2012 上安装 SQL Server 2012 时,提示 启用 Windows 功能 NetFx3 时出错,错误代码:-2146498298.请尝试从 Windows 管理工具启用Windows 功能 NetFx,然后重新运行安装程序.有关如何启用 Windows 功能的详细信息,请参阅 http://go.microsoft.com/fwlink/?linkid=227143 这个NetFx3就是.NET Framework 3.5 ,当通过服务管理器来安装时

用户文件夹在Finder中消失的问题

这个问题最早有人报告说.在升级了10.9.3的机器上.用户文件夹(/Users)会在Finder中消失.可是非常多人没有这个问题.经过多人的重复查证,最后锁定在iTunes 11.2更新上.假设用户打开了iCloud中的Find My Mac功能,那么安装了iTunes 11.2的更新后,就会产生这种问题.并且用户文件夹/Users的权限会被改为777,也就是不论什么人都能够在里面读写删除. 这个非常危急.而这个行为在10.9.2的机器上相同存在,所以能够排除10.9.3升级导致. 苹果已经公布

用户目录在Finder中消失的问题

这个问题最早有人报告说,在升级了10.9.3的机器上,用户目录(/Users)会在Finder中消失.但是很多人没有这个问题.经过多人的反复查证,最后锁定在iTunes 11.2更新上.如果用户打开了iCloud中的Find My Mac功能,那么安装了iTunes 11.2的更新后,就会产生这样的问题,而且用户目录/Users的权限会被改为777,也就是任何人都可以在里面读写删除.这个很危险!而这个行为在10.9.2的机器上同样存在,所以可以排除10.9.3升级导致. 苹果已经发布了一个最新的

SQLServer 2012中,设置“时间”默认值为“当前时间&quot;

最近,需要在SQLServer 2012中,设置datetime的默认值为当前时间. 通过可视化窗口进行设置,而不是将getdate()函数写在sql语句中,也不是将‘2022-2-2 22:22:22’写在sql语句中. 起初网上已经有文章写到,不过更多的是写在sql语句中,当时设置默认值的格式有些问题,一直失败. 正确插图:  (getdate()) 其实它是一个可视化而已,在sql语句中拼写getdate()能ok,在可视化窗口也ok的. 就是这么简单,但当时脑残了,非得加上单引号什么乱七