TDD介绍

TDD是一种开发方法,全称是Test-Driven development,中文是测试驱动开发。作者是Kent Beck。首先让我介绍一下三种常见的开发方式:

第一种:先Coding,然后Bug Fix。

第二种:先Coding,然后Unit Test,最后Bug Fix。很显然用了单元测试的比第一种开发方式要好不少。

三种:就是本文要说的TDD,它的方式和第二种恰恰相反。TDD先设计单元测试,然后再Coding,最后修复Bug。看下图:

TDD开发过程可以看成:给制自己制定一个目标,然后努力去完成这个目标。下面是这个比喻对应关系。斜杠前面的是TDD,斜杠后面的是完成目标:

1、写一个测试  /  制定一个目标

2、编译     / 了解完成目标的标准

3、运行测试,结果失败  /   目标没有达成

4、修改代码    /     为了完成目标,不停奋斗

5、再次运行测试,结果通过  /    目标达成。

这个说明应该比较形象啦。

下面我们看下真正的TDD循环,如下图所示:

TDD循环:

第一步:写测试类,然后拿去编译。

第二步:将编译生成好的dll之类的拿去测试,测试失败。

第三步:失败之后,就去修改测试的代码,直到测试通过。

第四步:测试成功之后,去重构你的代码,增加代码的可读性,但不能改变程序的任何功能。重构代码之后还需要测试,必须测试成功为止。

这四个步骤之后,在从写测试类重新开始其他的功能。

ASP.NET MVC中进行TDD开发

下面用一个在asp.net mvc2 中进行一次简单的TDD开发实战。单元测试我使用NUnit。

新建一个你类库项目命名为Test.Unit。再建一个asp.net mvc2的项目。项目结构如下图:

首先进行第一步,写测试确定要实现什么:我们实现一个数据列表的显示。

在类库项目中添加一个nunit.framework引用,然后再设计一个TodoControllerTest类用于测试控制器。

usingNUnit.Framework; 
namespaceTest.Unit 

  [TestFixture] 
  public  classTodoControllerTest 
   { 
        [Test] 
        public voidShould_Display_A_List_Of_Todo_Items() 
        {

}


}

这个测试类用于测试Todo控制器,它需要数据实体。所以我们要在asp.net mvc 项目中添加Model。在Model添加下面实体:

public class Todo
{public static List<Todo> ThingsToBeDone = new List<Todo>{new Todo {Title = "Get Milk", Completed = false},new Todo {Title = "Bring Home Bacon", Completed = false}};public bool Completed { get; set; }public string Title { get; set; }
}

我们修改TodoCpmtroller,代码如下:

[TestFixture]
public  class TodoControllerTest
{[Test]public void Should_Display_A_List_Of_Todo_Items(){var viewResult = (ViewResult)new TodoController().Index();Assert.AreEqual(Todo.ThingsToBeDone, viewResult.ViewData.Model); }}

测试TodoCpmtroller中的Index方法返回的数据是否与Todo的ThingsToBeDone相同,而此时我们还没有在MVC项目中添加TodoController类和Index方法。

故我们需要在MVC项目中添加TodoController类,代码如下:

public class TodoController : Controller
{//// GET: /Todo/public ActionResult Index(){return View();}}

我们编译项目发现没有错误。

使用Nunit进行测试,发现测试不通过,这对应TDD循环的的第二步。

因为Index中没有返回任何的数据,所有才会测试失败。修改Index方法,代码如下。

public class TodoController : Controller
{//// GET: /Todo/public ActionResult Index(){ViewData.Model = Todo.ThingsToBeDone;return View();}}

编译继续测试,发现测试通过。对应上文的第三步。

这个例子非常简单,也就用不着去重构代码,所以TDD循环的第四步可以省去。然后接着下一轮的循环。

总结:本文首先简单的介绍了一下TDD,随后在asp.net mvc中进行了实战。

参考:Test-Drive ASP.NET MVC

本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/08/02/Test-Drive-IN-ASP-NET-MVC.html,如需转载请自行联系原作者

在ASP.NET MVC中进行TDD开发相关推荐

  1. ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)

    AJAX的好处就是不会堵塞页面,可以提高用户体验,可以减少数据传输尺寸,提高应用程序的性能.目前,AJAX技术可以说是已经成为WEB开发的标准技术. AJAX技术是纯客户端技术,任何客户端框架(如:M ...

  2. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

  3. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  4. 如何在 ASP.NET MVC 中集成 AngularJS

    介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...

  5. [MVC]Asp.net MVC中的Session

    [MVC]Asp.net MVC中的Session 2008年12月9日 分类: ASP.NET, ASP.NET MVC, C#, 开发笔记 最近使用ASP.NET MVC 中的Controller ...

  6. 在 ASP.NET MVC 中创建自定义 HtmlHelper

    在ASP.NET MVC应用程序的开发中,我们常碰到类似Html.Label或Html.TextBox这样的代码,它将在网页上产生一个label或input标记.这些HtmlHelper的扩展方法有些 ...

  7. 通过源代码研究ASP.NET MVC中的Controller和View(二)

    通过源代码研究ASP.NET MVC中的Controller和View(一) 在开始之前,先来温习下上一篇文章中的结论(推论): IView是所有HTML视图的抽象 ActionResult是Cont ...

  8. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  9. ASP.NET MVC中你必须知道的13个扩展点

         ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...

最新文章

  1. 数据变异性的度量 - 极差、IQR、方差和标准偏差
  2. linux网络编程-posix信号量与互斥锁(39)
  3. Openstack Nova 源码分析 — 使用 VCDriver 创建 VMware Instance
  4. golang struct 转map 及 map[string]*Struct 初始化和遍历
  5. java 多个 panel_在Java中,每次我向JPanel添加多个东西时,第二...
  6. IOS之代理的使用(重点)
  7. codeforces 1060a(思维水题)
  8. myeclipse编程技巧--中编辑器输入任何字母都出现提示功能
  9. [C语言 - 13] 运算符
  10. 浅谈大比例尺数字地形图的缩编方法
  11. 塔菲克蓝牙适配器驱动_TAFIQ蓝牙适配器驱动下载|TAFIQ蓝牙适配器驱动 v4.0 最新免费版 下载 - 巴士下载站...
  12. 动画:用动画给面试官解释 TCP 三次握手过程
  13. 简述osi参考模型各层主要功能_简述OSI参考模型定义及各层的主要功能
  14. 看了这些 Go2 错误处理的提案,我真的会谢
  15. 前后端交互node服务器
  16. Java 如何把gb2312编码转化为汉字(互转)
  17. MpAndroidChart饼图
  18. linux主分区扩容
  19. 想做游戏场景建模师,如何拿到高薪资?
  20. 2020年中国全国5级行政区划(省、市、县、镇、村)

热门文章

  1. linux创建分区_在Linux中创建分区-分步指南
  2. dax圣经 翻新_使用翻新和Node JS的Android图像上传
  3. 免费下载谷歌maps软件_Android Google Maps当前位置,夜间模式功能
  4. iOS UISearchController和UITableView
  5. json 例子_json-简单的例子
  6. mac系统安装python(2.7)requests库
  7. Java基础之如何修改字符串?
  8. abp 基于api接口的页面内容提交
  9. mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting
  10. samba访问其他服务器文件权限设置