我的TDD实践---TDD概念篇
“我的TDD实践”系列之TDD概念篇
写在前面:
我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先行,后理论专精的目的。
TDD实践系列文章:
1.TDD概念篇
2.CI持续集成
3.SVN架设篇
简介
1. TDD概念
TDD(Test-Driven Development, 测试驱动开发)已经成为现代软件开发中非常重要的概念之一。TDD以测试用例为指导要求开发人员,开发出符合测试用例的程序,然后通过测试用例对程序进行验收,这被叫做“测试先行的开发”。通过,一个很小范围的功能的开发---验收过程,增加软件的内部稳定性,从而在整体上保证了软件的健壮性。这是与传统软件开发流程所不同的地方,也是传统的软件开发所达不到的一种软件开发的“实践方式”。
2. 发展历程
2.1 瀑布开发之前:软件工程的发展初期,由于计算机资源等诸多限制,软件的规模很小,拥有设备的开发人员更多的趋向于“迭代”开发,独立完成功能,然后在逐步完善,这是一种早期的迭代开发。
2.2 瀑布式开发: 随着计算机硬件的提高以及高级语言的出现,开发人员逐渐摆脱硬件的束缚,而逐渐使用高级语言的特性,提高了移植性。有了这些,为大型软件的开发奠定了基础。一般定义一个相对大规模的软件开发(2年或更多),需要经历的一般过程 是: 项目启动---》需求分析---》架构设计---》代码设计---》测试---》交付
缺点: 软件测试时间长,每个过程需等待其他过程完成之后才能进行(效率低),成本高,难度大,修改影响范围大。
瀑布式开发就像三峡的船闸一样,每一步都只能等待上一步完成之后才能进行。

2.3 瀑布+迭代开发:单纯瀑布开发的根本缺点是,需求分析是在项目开始之前,而不是在之中进行的,这就要求瀑布开发对最初的需求分析定位十分的准确,对可能的扩展预先估计的很好,但这几乎是不可能的。这时,人们逐渐转向”迭代“和”递增“开发。这一 概念就要求把大的瀑布模型分成几个不同的小的瀑布阶段,每完成几个小的迭代然后进行大的迭代开发。这样在一定程度上保证了,可变更性。但是从整体上来说还是典型的瀑布式开发,前后过程仍然受到制约。
2.4 敏捷开发:业务的变化不可避免,所以软件开发业必须能够适应。包括但不限于:Scrum,XP(极限编程),FDD(功能驱动开发),Clear-Case,ASD(自适应软件开发)。其中TDD属于XP的一种,是从测试先行实践中发展而来。
3. 敏捷开发共同特征及原则
价值观:
个人与互动 》 流程与工具
可用的软件 》 详尽的文档
与客户合作 》 合约协商
响应变化 》 遵循计划
特征:
√ 它们都将团队内部的交流放在首要位置。鼓励不同团队人员经常交流。特别是开发人员与测试人员,架构师与开发人员。
√ 它们注重项目的透明性。如每周的例会,板报等等。
√ 团队成员是相互负责的,勇于承担责任,不推卸责任。
√ 开发人员没有自己的代码基,而团队拥有完整的代码基,每个人都对其负责。
√ 工作是在短暂的开发周期中完成的,一般情况下为一周至两周。
√ 必须包含应对变化的能力。
√ 一个系统的大致框架是提前定义好的,但是详细设计要等实际安排功能开发计划时才会进行。
4. TDD的优点
√ TDD从一开就保证了代码的质量:鼓励开发人员只开发”最小化“的代码完成特定测试功能。
√ 遵循SOLID原则: SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)---Wiki
√ TDD确保了代码与业务需求之间的高度一致性。
√ TDD鼓励创建更简单,针对性更强的API
√ TDD鼓励更多的沟通,与企业,与团队内部。
√ TDD有助于清除冗余代码
√ TDD提供了内置的回归测试。
工具
工欲善其事,必先利其器。
对TDD而言,首先是整体设计,然后是功能设计,功能设计中通过编写测试用例来驱动开发。在开发过程中最基本的,最重要的是单元测试。而单元测试工具就成为了争论的热点,本篇不想过多讨论工具的取舍,这些可以参考同系列的其他文章。
TDD理论中很多工具是围绕UnitTest展开的。

更多详尽的内容请关注,同系列文章。
我的TDD实践---TDD概念篇的更多相关文章
- 我的TDD实践---SVN架设篇
我的TDD实践---SVN架设篇 “我的TDD实践”系列之SVN架设 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭 ...
- 我的TDD实践---UnitTest单元测试
我的TDD实践---UnitTest单元测试 “我的TDD实践”系列之UnitTest单元测试 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则 ...
- 我的TDD实践---CI持续集成
“我的TDD实践”系列之CI持续集成 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先行,后理论专精 ...
- TDD实践感悟
每个开发者都想开发出高质量的代码,更少的Bug.更容易维护不仅让人心情愉悦,也让我们有更多时间去学习和生活. 少加一些班,多陪家人,:) 当开发任务非常简单时,比如基本的增删改查,可能使用怎样的方式开 ...
- (c++11)随机数------c++程序设计原理与实践(进阶篇)
随机数既是一个实用工具,也是一个数学问题,它高度复杂,这与它在现实世界中的重要性是相匹配的.在此我们只讨论随机数哦最基本的内容,这些内容可用于简单的测试和仿真.在<random>中,标准库 ...
- 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...
- 【转】android 电容屏(二):驱动调试之基本概念篇
关键词:android 电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung ...
- LDA工程实践之算法篇之(一)算法实现正确性验证(转)
研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiw ...
- DNA拷贝数变异CNV检测——基础概念篇
DNA拷贝数变异CNV检测——基础概念篇 一.CNV 简介 拷贝数异常(copy number variations, CNVs)是属于基因组结构变异(structural variation), ...
随机推荐
- bluemix部署(一)简单测试,搭建样本flask程序。
1.注册bluemix 这个略 2.登录bluemix 这个也略 3.创建组织 这个确实是和我们的思想不一样.要创建组织.为什么呢?国内的很多服务都没见过组织这个概念.貌似神符合一个中国人是条龙,十个 ...
- vue-router-7-重定向及别名
const router = new VueRouter({ mode: 'history', base: __dirname, routes: [ { path: '/', component: H ...
- 字符与字符串3——char 的大小
字符变量占用内存的大小,也就是char类型声明的变量,这个变量占多少字节. 一字节 char c = 'A'; printf("%d,%d\n", sizeof(c),sizeof ...
- java阶段学习目标
0-1年: <java编程思想> 1-2年: <大话设计模式>http://www.cnblogs.com/zuoxiaolong/p/pattern26.html <重 ...
- :单件模式:Singleton
#ifndef __SINGLETON_H__ #define __SINGLETON_H__ class Singleton { private: static Singleton* instanc ...
- Spring MVC中注解: @ModelAttribute 与@RequestParam区别
相关链接 : https://blog.csdn.net/huang343/article/details/77491096
- 20165326 java第八周学习笔记
第八周学习笔记 知识点总结 1.进程与线程 进程:程序的一次动态执行过程 区别:进程和线程的区别? 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元 同一个进程中可以包括多个线程,并 ...
- [MyBatis] MyBatis理论入门
什么是MyBatis iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs) 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyB ...
- Linux:NFS配置
NFS配置 1.创建分享的文件:touch /var/www/html/aa.txt2.查看是否安装NFS:rpm -qa|grep nfs3.查看IP地址:ifconfig4.配置NFS:vi /e ...
- python基础之socket与socketserver
---引入 Socket的英文原义是“孔”或“插座”,在Unix的进程通信机制中又称为‘套接字’.套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成.Socket正如其英文原意那样,像一个多孔 ...