测试驱动开发 TDD
一、详解TDD
1.1、TDD概念 :Test Drived Develop
测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种方法论。TDD的原理是在开发功能代码之前,编写单元测试用例代码,测试代码决定先编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只是适用于XP,同样可以适用于其他开发方法和过程
TDD的基本思路就是通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过成。
TDD的重要目的不是仅仅测试软件,测试工作保证代码质量只是其中一部分,而且是开发过程中帮助客户和程序员去除模棱两可的需求。TDD首先考虑使用需求(对象、接口、功能、过程、等)
1.2 测试驱动开发的优缺点
TDD:测试驱动开发的优点:
再任意一个开发节点都可以拿出一个可以使用,含少量的BUG 并具有一定的功能能够发布的产品。
TDD:测试驱动开发的缺点:
缺点:增加了代码工作量。测试代码几乎是系统代码的两倍或更多,但是同时节省了程序调试的时间以及挑错的时间。
TDD=TFD+Refactoring 第一次测试开发加上重构
TDD:Test First Development 首次测试开发
1.3、TDD原则
1.独立测试:不同代码的测试应该相互独立,一个类对应一个测试类(对于C代码或C++全局函数,则一个文件对应一个测试文件),一个函数对应一个测试函数用例也应该各自独立,每个用例不能使用其他用例的结果数据,结果也不能依赖于例执行顺序。一个角色开发过程中包含多种工作,(编写测试代码、编写产品代码、代码重构 等。做不同工作的时候,应专注于当前要做的事情,不考虑其他,比如测试的时候就做测试)
2.测试列表:代码的功能点很多,不可能是所有的需求都是很明确的,而是陆陆续续的出现新的需求,在进行的任何阶段时想添加功能时,应把相关的功能点 添加到测试列表中,在继续改阶段的工作,以避免疏漏。
3.测试驱动:及利用测试来驱动开发,是TDD的核心。要实现某个功能,要编写某个类或某个函数,应该先编写测试代码,明确这个类、这个函数如何使用,如何测试,然后对其进行设计、编码。
4.先写断言:编写测试代码时,应该首先编写判断代码功能的断言语句,然后编写必要的辅助语句。
能应该比较单纯,每个类、每个函数、只做自己的事情,不掺杂然和功能。
6.及时重构:对结构不合理,重复等不好的代码,在测试通过后,应及时进行重构。
7.小步前进:软件开发是复杂性非常高的工作,小步前进是降低复杂性的好办法。
1.4、TDD总结
测试驱动开发:既可以测试框架的性能、也可以测出业务的合理性,也可以测试出代码的问题、虽然开发时间会延后、但是可以提高客户的满意度,上线后系统比较稳定。
一个软件的产出,需要具有详细的设计:从开始的竞标,到立项到设计,开发,交付任何一个环节都不可缺少。
举例描述:
某公司竞标后拿下了这样一个工程,在两座山之间建造一座大桥,产品经理把业务具体分析过后交给了公司的设计师(架构师)设计师根据客户对产品的质量、美观、使用性、进行架构设计:产出物如下图:
架构师设计出有几个桥墩沉重力度,桥面宽度高度,形状。。。等。
这样整体架构就出现了,高级工程师根据架构师的架构进行小的设计比如说用什么样的材料怎么做桥于桥之间的关联等,(在开发来说就是用什么接口,接口怎么制定,怎么保证安全性)剩下的就交给中级工程师了,等到开发完后进行测试。
上面简单的描述是一般产品的产出流程,但是一般的流程去做这样一个特殊的工程显然不够的,比如说怎么知道这个框架是否安全,现在的说服力一般都体现在数字和具体的有说服力的案例上面,但是没有案例的话,就需要我们队框架进行测试了,在这个没有真正做施工之前,框架设计出之后进行的测试,大家就可以理解成TDD测试了,这时候的TDD很显然偏向于架构的设计。再往小点的方面来说比如测试接口的时候,其实也是设计接口,TDD偏向于设计,而不是很多人认为的测试。
利用TDD 测试驱动 举一个例子:
业务场景:用户下订单,订单类型“普通订单、批量订单、个人订单” 判断用户是是否具有下此类订单的权限。
如果所根据这个业务让咱们设计一下咱们肯定都没有问题:
数据库创建脚本
- CREATE TABLE OederTable --订单表
- (
- ID INT PRIMARY KEY IDENTITY (,), -- ID
- OredrNo varchar(), --订单编号
- OrderTypeNo varchar(), --订单类型编号
- CreateBy varchar()--创建人
- )
- CREATE TABLE UserRights --用户权限表
- (
- OrderTypeNo varchar(),--订单类型编号
- UserID INT --用户ID
- )
- CREATE TABLE UserTable --用户表
- (
- ID INT PRIMARY KEY IDENTITY (,), --ID
- UserName varchar(), --用户名
- UserPwd varchar() --用户密码
- )
- CREATE TABLE TypeTable --订单类型表
- (
- OrderTypeNo varchar(),--订单类型编号
- OrderTypeName varchar()--订单类型名称
- )
填充数据
实现测试业务流程代码具体如下:
代码中映射了四个实体类,一个订单操作类。
订单操作类具体代码如下(代码中并没有具体实现主要以意会为主(~o~))
- //测试代码
- public void TestMethod1()
- {
- OrderOperation OrderOperation = new OrderOperation();
- OederTable Oeder = new OederTable();
- Oeder.OredrNo = "";
- Oeder.OrderTypeNo = ""; //普通订单权限
- Oeder.CreateBy = "admin";
- //1.验证用户是否存在
- //2.验证用户是否是否具有下订单的权限
- //3.保存入库
- /************假设用户表为空时咱们已经通过用户名密码查询过并且存在该用户*************/
- UserTable user = new UserTable();
- if (user != null)
- {
- //通过UserID查询权限是否有下普通订单的权限 Oeder.OrderTypeNo = "1"; 普通订单权限
- UserRights Rights = new UserRights();
- if (Rights != null)
- {
- //添加入库
- OrderOperation.add(Oeder);
- }
- }
- }
其实不管用任何办法,只要结果符合描述就行,HARD Code 也是一个很好的方法,我们现在关注点应该放在业务流程的正确性,数据从哪里来不重要。
如果添加成功最好有一个返回值能体业务的正确性,比如添加成功后返回“OK”
以上描述有部分来自于互联网:
测试驱动开发 TDD的更多相关文章
- 测试驱动开发(TDD)的思考
极限编程 敏捷开发是一种思想,极限编程也是一种思想,它与敏捷开发某些目标是一致的.只是实现方式不同.测试驱动开发是极限编程的一部分. 1.极限编程这个思路的来源 Kent Beck先生最早在其极限编程 ...
- 测试驱动开发(TDD)及测试框架Mocha.js入门学习
组里马上要转变开发模式,由传统的开发模式(Developer开发,QA测试),转变为尝试TDD(Test-driven development,测试驱动开发)的开发模型.由此将不存在QA的角色,或者仅 ...
- 原创翻译-测试驱动开发(TDD)
测试驱动开发原则 翻译自<<Expert Python Programming>> 测试驱动开发是指首先编写包含所有测试软件特点的测试集,然后再去开发软件.也就是说,在编写软件 ...
- 44 | 测试先行:测试驱动开发(TDD)
- 浅谈测试驱动开发(TDD)
测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量.本文从开发人员使用的角度,介绍了 TDD 优势.原理.过程.原则.测试技术.Tips 等方面. ...
- (转)浅谈测试驱动开发(TDD)
测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量.本文从开发人员使用的角度,介绍了 TDD 优势.原理.过程.原则.测试技术.Tips 等方面. ...
- 敏捷开发 —— TDD(测试驱动开发)
测试驱动开发 TDD(Test-Driven Development)是敏捷开发的一项核心实践,同时也是一种设计技术和方法. 既然是测试驱动,便是测试,测试用例先行: 首先编写好测试用例,期待值,实际 ...
- 测试驱动开发与Python
最近在看一本书<Test-Driven Development with Python>,里面非常详细的介绍了如何一步一步通过测试驱动开发(TDD)的方式开发Web项目.刚好这本书中使用了 ...
- 基于Python的测试驱动开发实战
近年来测试驱动开发(TDD)受到越来越多的关注.这是一个持续改进的过程,能从一开始就形成规范,帮助提高代码质量.这是切实可行的而非天马行空的. TDD的全过程是非常简单的.借助TDD,代码质量会得到提 ...
随机推荐
- >/dev/null 2>&1
>/dev/null 2>&1 大部分在 crontab 计划任务中都会年到未尾带 >/dev/null 2>&1,是什么意思呢? > 是重定向 /dev ...
- 12、Libgdx的图像之全屏和垂直同步
(官网:www.libgdx.cn) 检测当前设置 判断是否设置全屏,可以通过如下方式: boolean fullscreen = Gdx.graphics.isFullscreen(); 设置全屏和 ...
- oracle ebs应用产品安全性-数据访问权限集
定义 数据访问权限集是一个重要的.必须设定的系统配置文件选项.对具有相同科目表.日历和期间类型的分类帐及其所有平衡段值或管理段值的定义读写权限,系统管理员将其分配至不同的责任以控制不同的责任对分类帐数 ...
- Unity热更新之C#反射加载程序集
用C#反射加载程序集的方式可以动态的从assetBundle资源包或其他资源包里加载脚本到工程中,即便是原工程中不存在的脚本. 我这里就用加载本地assetBundle的方式来进行讲解了,加载网络上的 ...
- 100个Myeclipse6.5免费注册码
下面提供了100个MyEclipse6.5的注册码供大家使用: register name:cghidigfa Serial:pLR8ZC-855550-6359775146444620 ------ ...
- Erlang Rebar 使用指南之四:依赖管理
Erlang Rebar 使用指南之四:依赖管理 全文目录: https://github.com/rebar/rebar/wiki 本章链接: https://github.com/rebar/re ...
- spring的maven配置文件
spring各个包的maven配置文件 <!--spring-context--> <dependency> <groupId>org.springframewor ...
- BMP 转 YUV (BMP2YUV)
本文介绍BMP 转 YUV.其实这是以前"数据压缩"实验课上的内容,前几天有人问我相关的问题,突然发现自己有一段时间没有接触BMP也有些生疏了,因此翻出资料总结一下. BMP文件格 ...
- PS 图像调整算法——黑白
这个算法是参考自 阿发伯 的博客: http://blog.csdn.net/maozefa 黑白调整 Photoshop CS的图像黑白调整功能,是通过对红.黄.绿.青.蓝和洋红等6种颜色的比例调节 ...
- python实现博客自动刷点击脚本
#A Auto-Visit Web Site Tool import urllib import time import random print "Auto Click the WebPa ...