版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、敏捷开发 之测试驱动开发和结对,ITBU-技术部 徐宗敏 2010年3月18日,Agent,为什么要敏捷?,需求经常在变化,为什么要敏捷?,需求失真,为什么要敏捷?,kickoff,没有足够的时间,发布,为什么要敏捷?,提高产品的质量,敏捷开发和传统开发流程的对比,敏捷开发“前”的产品开发过程(瀑布模型),敏捷开发和传统开发流程的对比,敏捷开发“后”的产品开发过程(迭代模型),敏捷开发的价值观,敏捷开发方法,敏捷开发方法,敏捷开发方法需要全用吗?,不需要,Agent,测试的抱怨,敏捷对测试挑战,敏捷对开发过程带来了曙光 敏捷确给测试带来了挑战 开发会创建更少的文档,更多的时间关注开发,放在沟通
2、,让用户满意的产品上。 敏捷的过程中可能需要每个星期就发一个版本 需求和设计有更加频繁的改变,测试和开发资源的对比,Google 的测试文化,所有工程师对质量有着同等重要的责任 测试的任务不仅是发现bug,更重要的是帮助开发人员一起提高产品质量 有效地进行验收测试、持续集成、测试驱动开发、自动化测试、结对。 开发在设计的同时就考虑可测试性。 重沟通,每周会沟通做了什么功能,存在什么风险 以任务而非角色安排工作,共享同样的目标,共享同样的任务。,Alibaba 的测试情况,80%开发人员认为测试就是测试人员的事情 测试就是不断的发现bug 无建立好的持续集成框架 80%的项目无考虑可测试性,部分
3、是提交了测试之后再考虑 单元测试覆盖率低 有codereview,但无结对,今天,我们开发所必须要做的,意识到提高产品的质量也是开发的重要责任 引用敏捷开发的测试驱动开发和结对,提高产品质量 帮助测试人员建立持续集成框架、验收测试的标准 可测试性的设计,Agent,从一句大师的话开始,编写单元测试是在进行验证,更是在进行设计。同样,它更是在编写文档。,心灵震憾,一段时间的学习,让我的内心受到了深深的震撼。我们原来的方法居然如此的笨。 以前我面对测试先行这一名字时,最大的疑问就是程序都还没有写出来, 测试什么呀!。 后来一想,其实这是一个泥瓦匠都明白的道理,却是自己在画地为牢。我们来看看两个不同
4、泥瓦匠是如何工作的。,工匠师傅的“测试驱动开发”,工匠一:先拉上一根水平线,砌每一块砖时,都与这根水平线进行比较,使得每一块砖都保持水平。 工匠二:先将一排砖都砌完,然后拉上一根水平线,看看哪些砖有问题,再进行调整。,这个就是线,你会选择哪种工作方法呢?,有可能你会骂工匠二笨吧!这样多浪费时间呀! 然而我们自己想想,我们平时在编写程序的时候又是怎么做的呢? 我们就是按工匠二的方法在干活的呀! 甚至有时候比工匠二还笨,是整面墙都砌完了,直接进行集成测试,经常让整面的墙倒塌。 看到这里,你还觉得自己的方法高明吗?,我们的问题,我们的问题,每一个程序员都知道应该为自己的代码编写测试程序,但却很少这样
5、做。 当有人问为什么的时候,最常听到的回答就是:我们的开发工作太紧张了 但这样却导致了一个恶性循环,越是没空编写测试程序,代码的效率与质量越差,花在找Bug、解决Bug的时间也越来越多, 实际效率大大降低。 由于效率降低了,因此时间更紧张,压力更大。你想想,为什么不拉上一根水平线呢? 难道,我们不能够将后面浪费的时间花在单元测试上,使得我们的程序一开始就更加健壮,更加易于修改吗?,测试驱动开发的精髓,将测试方案设计工作提前,在编写代码之前先做这一项工作; 从测试的角度来验证设计,推导设计; 将测试方案当作行为的准绳,有效地利用其检验代码编写的每一步,实时验证其正确性,实现软件开发过程的小步快走
6、。,What is TDD?,Test Driven Development(测试驱动开发) 测试先行。 持续重构。 测试驱动开发是一种在极限编程(XP)中处于核心地位的技术。,Why TDD?,确保每个方法都是可用的且已被测试过 确保及时发现出现问题的模块 添加或修改代码更容易 频繁地运行测试 迭代式递增开发 不断重构以改善设计,Why TDD?,TDD还能改善和验证设计: 以客户端的视角编写测试 为客户端提供了示例代码 更注重接口的设计 为了使测试容易,需要实现松散耦合 更少的Debug时间,How to do TDD?,1、写一个空方法。 2、写一个测试程序(单元测试用例)。 3、让程序
7、编译通过。 4、运行测试程序,发现不能运行。(红条) 5、让测试程序可以运行。(绿条) 6、消除重复设计,优化设计结构。(绿条) 7、重构,确定业务,1、用户可以选择付费月份为1、2、3个月 2、用户选择1个月最多可用1个红包 3、用户选择2个月最多可用2个红包 4、用户选择3个月最多可用3个红包,1、写一个空方法,public class CouponManagerImpl /* * 根据选择充值月数和拥有的最大红包数,取得可用红包数 * param months 充值月数 * param totalCoups 拥有的最大红包数 * return 可用红包数 */ public int ge
8、tNumOfCoupsCanUse(int months, int totalCoups) / TODO 完成该方法 return 0; ,2、写一个测试程序,public class CouponManagerImplTest extends TestCase public void testGetNumOfCoupsCanUse() CouponManagerImpl cm = new CouponManagerImpl(); assertEquals(0, cm.getNumOfCoupsCanUse(1, 0); assertEquals(1, cm.getNumOfCoupsCanU
9、se(1, 1); assertEquals(1, cm.getNumOfCoupsCanUse(1, 5); assertEquals(2, cm.getNumOfCoupsCanUse(2, 5); assertEquals(3, cm.getNumOfCoupsCanUse(3, 5); assertEquals(1, cm.getNumOfCoupsCanUse(3, 1); / 边界检查 assertEquals(0, cm.getNumOfCoupsCanUse(0, 5); assertEquals(3, cm.getNumOfCoupsCanUse(4, 5); 运行结果为:,
10、3、完成程序,public int getNumOfCoupsCanUse(int months, int totalCoups) if (months = 1) return totalCoups = 1? 1:0; else if (months = 2) return totalCoups = 2 ? 2 : totalCoups; else if (months = 3) return totalCoups = 3 ? 3 : totalCoups; else return 0; 运行测试:,4、优化程序,public int getNumOfCoupsCanUse(int month
11、s, int totalCoups) if (months 3) return 0; return (totalCoups = months) ? months : totalCoups; 运行测试:,业务变更:增加6个月选择,1、用户可以选择付费月份为1、2、3、6个月 2、用户选择1个月最多可用1个红包 3、用户选择2个月最多可用2个红包 4、用户选择3个月最多可用3个红包 5、用户选择6个月最多可用3个红包,更改测试,public void testGetNumOfCoupsCanUse() CouponManagerImpl cm = new CouponManagerImpl();
12、assertEquals(0, cm.getNumOfCoupsCanUse(1, 0); assertEquals(1, cm.getNumOfCoupsCanUse(1, 1); assertEquals(1, cm.getNumOfCoupsCanUse(1, 5); assertEquals(2, cm.getNumOfCoupsCanUse(2, 5); assertEquals(3, cm.getNumOfCoupsCanUse(3, 5); assertEquals(1, cm.getNumOfCoupsCanUse(3, 1); assertEquals(1, cm.getNu
13、mOfCoupsCanUse(6, 1); assertEquals(3, cm.getNumOfCoupsCanUse(6, 5); / 边界检查 assertEquals(0, cm.getNumOfCoupsCanUse(0, 5); assertEquals(0, cm.getNumOfCoupsCanUse(4, 5); assertEquals(0, cm.getNumOfCoupsCanUse(7, 5); 运行结果:,重构程序,/* * 根据选择充值月数和拥有的最大红包数,取得可用红包数 * * param months 充值月数 * param totalCoups 拥有的最大红包数 * return 可用红包数 */ public int getNumOfCoupsCanUse(int months, int totalCoups) if (months = 1 运行测试:,Agent,小时候结对学习,小时候结对学习的关键词,长大了要结对编程,结对编程的关键词,结对中需要做的,结对的好处,互相学习,学习人家的设计思路、开发技巧 互相backup 提高产品质量 促进沟通 促进问题及时反馈,结对中的取舍,不是结对编程,而是结对开发 无需两两同时进行 需要根据项目的大小和难易而定,Agent,总结,有哪个项目不感叹测试资源投入太少呢?我们现在的开发和测试
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肺CT重建教学课件
- 八年级劳动包饺子期末复习教案
- 【新教材】人教精通版(2024)三年级上册英语Unit 3 Toys Story time 教案
- 帆船拼音课件制作课件
- 蜂巢模式课件
- 08-0-PS-sodium-生命科学试剂-MCE
- 防触电小班课件
- 2026-2027学年初中心理健康七年级下册(2025)北师大版(2025)第六课 学习微习惯课时卷
- 第10周作业答案 习题解答辅导 可编辑 配套学习辅导
- 塔吊司机安全技术交底
- 2026招生计划物理类
- 2026年南阳市中心医院医护人员招聘笔试题库及答案解析
- 2026年一级造价工程师《建设工程造价案例分析(土建)》考试真题及答案
- 发热待查的中西医诊治专家共识课件
- 2026年部编版语文四年级上册第六单元教学设计
- 2026年陕西单招英语完形填空必刷题含答案省考试院命题风格
- 干细胞采集室工作制度
- 黄金店安全责任制度
- 2025-2026学年河南省信阳市平桥区人教版三年级上册期中测试数学试卷(含答案)
- 2026年辽宁铁道单招测试题附答案
- DevOps培训课件教学课件
评论
0/150
提交评论