我的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), ...
随机推荐
- 为什么IT运维工程师要学习Linux系统
不论你是否知道,其实你每天都在使用Linux.每次你访问微博.百度甚至是一些小电影网站,你的客户端(浏览器)都在与运行在Linux系统上的服务端程序进行通讯,大多数的电子设备,例如数位录像机.飞机.自 ...
- java套接字(socket)实例
客户端socket 流程: 1.连接远程主机 2.发送数据 3.接收数据 4.关闭流与socket连接 实例: import java.io.*; import java.net.Socket; im ...
- SQL-35 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
题目描述 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5 ...
- WebView加载页面
//使用内置浏览器webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoa ...
- connection reset 分析解决(转载)
文章转自:https://my.oschina.net/xionghui/blog/508758;记录下来以便以后复习查阅; 在使用HttpClient调用后台resetful服务时,“Connect ...
- 位(bit)、字节(Byte)、MB(兆位)之间的换算关系
B是Byte的缩写,意思是字节:b是bit的缩写,意思是比特位:Kb是千比特位,KB是千字节:MB意思是兆字节: 换算关系: 1MB=1024KB=1024B*1024=1048576B: 8bit= ...
- __autolaod
转载自:https://blog.csdn.net/baidu_30000217/article/details/52743139 php实现类文件自动载入有两种办法: 魔术方法:__autoload ...
- 2019-03-15-day011-递归生成器
函数的进阶: 动态参数: 两种: 动态位置参数 > 动态默认参数 打散(聚合): 实参处打散 形参处聚合 不在函数中第一次使用*打散,第二次是聚合 在数据库中快速写入数据的时候,**dic 名称 ...
- Java学习笔记22(List接口)
List接口继承自Collection接口,自身具有三大特点: 1.有序集合:存入和取出的顺序一致: 2.此接口的用户可以对每个元素插入位置进行精确控制:可以通过索引操作元素 3.可以存储重复元素 L ...
- 解析JSON 注意解析数据为一个对象的情况.--加一下说明
应用场景: 调某接口时, 获取json数据, 需要对数据进行解析 . 第一种: 只判断接口是否调用成功 { "code":"10102000", "d ...