软件工程设计模式与思想-敏捷开发_第1页
软件工程设计模式与思想-敏捷开发_第2页
软件工程设计模式与思想-敏捷开发_第3页
软件工程设计模式与思想-敏捷开发_第4页
软件工程设计模式与思想-敏捷开发_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

敏捷开发

之测试驱动开发Agent1敏捷开发概述2测试和开发之间的问题3测试驱动开发4结对5总结6Q&A为什么要敏捷?互联网产品的关注点用户体验创新为用户创造价值为什么要敏捷?互联网产品的开发建立在用户体验基础上的创新小步快走微创新快速获取用户反馈为什么要敏捷?快意味着一切快速实现的能力快速发布的能力快速修复的能力提高产品的质量为什么要敏捷?对待缺陷的态度互联网产品中的缺陷同样致命,但是修复成本相对较低服务端push让修复后的版本发布代价大大降低可靠性和性能可以通过集群或者冗余运算的方式部分解决在最坏的情况下,回滚吧!为什么要敏捷?缺陷并非总那么可怕在快速发布的环境中快速发现缺陷快速修复bug缺陷从发现到修复并部署的周期可以被控制的很短敏捷开发方法测试驱动开发敏捷开发的价值观简单我们要用最简单的方式做我们的事情,无论是设计、开发实现还是测试沟通产品和开发、测试之间测试和用户之间开发和开发之间产品和用户之间勇气勇于去创新,勇于去改变,勇于接受改变反馈不断反馈的过程就是不断建立信心的过程。Agent1敏捷开发概述2测试和开发之间的关系3测试驱动开发4结对5总结6Q&A测试的抱怨1.需求变化2.文档更新不及时3.时间太少4.开发质量低5.可测试性差敏捷对测试挑战敏捷对开发过程带来了曙光敏捷确给测试带来了挑战开发会创建更少的文档,更多的时间关注开发,放在沟通,让用户满意的产品上。敏捷的过程中可能需要每个星期就发一个版本需求和设计有更加频繁的改变测试和开发资源的对比Google1/10Alibaba1/3Microsoft1/1Google的测试文化所有工程师对质量有着同等重要的责任测试的任务不仅是发现bug,更重要的是帮助开发人员一起提高产品质量有效地进行验收测试、持续集成、测试驱动开发、自动化测试、结对。开发在设计的同时就考虑可测试性。重沟通,每周会沟通做了什么功能,存在什么风险以任务而非角色安排工作,共享同样的目标,共享同样的任务。Alibaba的测试情况80%开发人员认为测试就是测试人员的事情测试就是不断的发现bug无建立好的持续集成框架80%的项目无考虑可测试性,部分是提交了测试之后再考虑单元测试覆盖率低有codereview,但无结对今天,我们开发所必须要做的意识到提高产品的质量也是开发的重要责任引用敏捷开发的测试驱动开发和结对,提高产品质量帮助测试人员建立持续集成框架、验收测试的标准可测试性的设计Agent1敏捷开发概述2测试和开发之间的关系3测试驱动开发4结对5总结6Q&A从一句大师的话开始

编写单元测试是在进行验证,更是在进行设计。同样,它更是在编写文档。心灵震憾一段时间的学习,让我的内心受到了深深的震撼。我们原来的方法居然如此的笨。以前我面对测试先行这一名字时,最大的疑问就是"程序都还没有写出来,测试什么呀!"。后来一想,其实这是一个泥瓦匠都明白的道理,却是自己在画地为牢。我们来看看两个不同泥瓦匠是如何工作的。

工匠师傅的“测试驱动开发”

工匠一:先拉上一根水平线,砌每一块砖时,都与这根水平线进行比较,使得每一块砖都保持水平。

工匠二:先将一排砖都砌完,然后拉上一根水平线,看看哪些砖有问题,再进行调整。这个就是线你会选择哪种工作方法呢?

有可能你会骂工匠二笨吧!这样多浪费时间呀!

然而我们自己想想,我们平时在编写程序的时候又是怎么做的呢?

我们就是按工匠二的方法在干活的呀!

甚至有时候比工匠二还笨,是整面墙都砌完了,直接进行"集成测试",经常让整面的墙倒塌。

看到这里,你还觉得自己的方法高明吗?

我们的问题时间少产品质量要求高变化多我们的问题

每一个程序员都知道应该为自己的代码编写测试程序,但却很少这样做。

当有人问为什么的时候,最常听到的回答就是:"我们的开发工作太紧张了"

但这样却导致了一个恶性循环,越是没空编写测试程序,代码的效率与质量越差,花在找Bug、解决Bug的时间也越来越多,实际效率大大降低。

由于效率降低了,因此时间更紧张,压力更大。你想想,为什么不拉上一根水平线呢?

难道,我们不能够将后面浪费的时间花在单元测试上,使得我们的程序一开始就更加健壮,更加易于修改吗?

测试驱动开发的精髓

将测试方案设计工作提前,在编写代码之前先做这一项工作;

从测试的角度来验证设计,推导设计;

将测试方案当作行为的准绳,有效地利用其检验代码编写的每一步,实时验证其正确性,实现软件开发过程的"小步快走"。

WhatisTDD?TestDrivenDevelopment(测试驱动开发)测试先行。持续重构。测试驱动开发是一种在极限编程(XP)中处于核心地位的技术。WhyTDD?确保每个方法都是可用的且已被测试过确保及时发现出现问题的模块添加或修改代码更容易频繁地运行测试迭代式递增开发不断重构以改善设计WhyTDD?TDD还能改善和验证设计:以客户端的视角编写测试为客户端提供了示例代码更注重接口的设计为了使测试容易,需要实现松散耦合更少的Debug时间HowtodoTDD?1、写一个空方法。2、写一个测试程序(单元测试用例)。3、让程序编译通过。4、运行测试程序,发现不能运行。(红条)5、让测试程序可以运行。(绿条)6、消除重复设计,优化设计结构。(绿条)7、重构确定业务1、用户可以选择付费月份为1、2、3个月2、用户选择1个月最多可用1个红包3、用户选择2个月最多可用2个红包4、用户选择3个月最多可用3个红包1、写一个空方法public

classCouponManagerImpl{

/***根据选择充值月数和拥有的最大红包数,取得可用红包数*@parammonths充值月数*@paramtotalCoups拥有的最大红包数*@return可用红包数*/

public

intgetNumOfCoupsCanUse(intmonths,inttotalCoups){//TODO完成该方法

return0;}}2、写一个测试程序public

classCouponManagerImplTestextendsTestCase{

public

voidtestGetNumOfCoupsCanUse(){CouponManagerImplcm=newCouponManagerImpl();

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(0,cm.getNumOfCoupsCanUse(0,5));assertEquals(3,cm.getNumOfCoupsCanUse(4,5));}}运行结果为:3、完成程序public

intgetNumOfCoupsCanUse(intmonths,inttotalCoups){

if(months==1){

returntotalCoups>=1?1:0;}else

if(months==2){

returntotalCoups>=2?2:totalCoups;}else

if(months>=3){

returntotalCoups>=3?3:totalCoups;}else{

return0;}}运行测试:4、优化程序public

intgetNumOfCoupsCanUse(intmonths,inttotalCoups){

if(months<1||months>3){

return0;}

return(totalCoups>=months)?months: totalCoups;}运行测试:业务变更:增加6个月选择1、用户可以选择付费月份为1、2、3、6个月2、用户选择1个月最多可用1个红包3、用户选择2个月最多可用2个红包4、用户选择3个月最多可用3个红包5、用户选择6个月最多可用3个红包更改测试public

voidtestGetNumOfCoupsCanUse(){CouponManagerImplcm=newCouponManagerImpl();

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.getNumOfCoupsCanUse(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));}运行结果:重构程序/***根据选择充值月数和拥有的最大红包数,取得可用红包数**@parammonths充值月数*@paramtotalCoups拥有的最大红包数*@return

可用红包数*/

public

intgetNumOfCoupsCanUse(intmonths,inttotalCoups){

if(months>=1&&months<=3){

return(totalCoups>=months)?months:totalCoups;}else

if(months==6){

return(totalCoups>=3)?3:totalCoups;}else{

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论