版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、如何提高产品开发品质讲解内容容目前开发过程存在的问题1产品开发品质保障流程2代码重构3测试驱动4日构建5一、目前前开发过过程存在在的问题题没有完善善的品质质保障流流程质量低下下的代码码不重视测测试产品开发发流程现现状开发人员员编写代代码调试,肉肉眼观观察有问题没问题(自认为为)可交付的的代码编译修正编译译错误登记到JIRA上客户提出出需求或或现场发现现bug产品品质质管理严严重缺失失该流程的的最终目目标和工工作重心心都是完完成产品品功能开开发,品品质管理理严重缺缺失。产产品的开开发质量量完全靠靠开发人人员的个个人责任任心以及及工作经经验来保保障,缺缺乏一个个稳定可可靠的质质量保障障流程。这种流
2、流程开发发出来的的产品往往往是质质量不可可靠,需需要经常常返工的的劣质产产品。质量低下下的代码码是导致致产品品品质不好好的根本本原因质量低下下的代码码体现在在以下几几个方面面:重复的代代码过长的函函数过大类过长的参参数列表表过度复杂杂的逻辑辑判断数据泥团团没有专职职测试人人员来进进行功能能性测试试工作在目前的的开发流流程中,开发出出来的代代码只经经过开发发人员自自己简单单的测试试,没有有专职的的测试人人员来进进行详细细的功能能性测试试。这样样导致的的结果往往往是提提交到现现场的代代码会带带有不少少BUG,一定定要经过过多次返返工才能能达到较较高的品品质。而而且这样样做的另另一个后后果是把把客户
3、当当作测试试人员,会给客客户留下下产品品品质不稳稳定这样样一种非非常不好好的客户户体验。开发人员员在开发发过程中中不重视视单元测测试单元测试试是提高高产品品品质非常常重要的的一个方方法,而而我们的的开发人人员往往往会忽视视这一点点。如果果没有单单元测试试,仅仅仅依靠测测试人员员的功能能性测试试,那么么这样的的测试工工作量会会非常大大,每次次修改一一个功能能,可能能会影响响到的其其他功能能都要一一一测试试,不仅仅测试时时间会非非常长,而且效效果也不不好,很很多细节节不一定定每次都都能测到到,这些些都是产产生BUG的隐隐患。同同时由于于我们业业务需求求都非常常复杂多多变的,没有一一个完善善自动化化
4、测试流流程,而而仅仅依依靠人工工测试,对产品品品质的的影响是是不言而而喻的。我们的目目标!编写出逻逻辑清晰晰、结构构简洁、扩展性性良好、可测试试性高的的优秀代代码。强化单元元测试工工作,提提高单元元测试覆覆盖率,搭建自自动单元元测试集集,通过过日构建建来持续续集成,对产品品质量进进行全面面控制。通过严格格的产品品质量管管理流程程,强化化质量管管理工作作,将所所有BUG消灭灭在公司司内部。二、产品品开发品品质保障障流程开发质量量管理本开发流流程的目目标是开开发出质质量优良良的产品品,流程程的重心心在于质质量管控控,通过过质量保保障人员员对产品品质量进进行全面面把关。对于没有有编写单单元测试试的代
5、码码直接打打回!质量保障障人员负负责进行行功能性性测试,并对提提交出去去的代码码负责。质量保障障人员另另一个职职责是思思考如何何持续改改进产品品质量。需求管控控对每个需需求进行行分级评评审,最最大程度度的降低低需求变变更的频频度。所有需求求开发前前都经过过内部评评审,对对于一些些复杂需需求把握握更加准准确,不不至于在在开发时时候产生生较大偏偏差。所有需求求的开发发工作都都有经过过客户签签字的开开发工作作量评估估,为商商务工作作开展创创造有利利条件。所有需求求都有详详细开发发计划,片区人人员可以以安排相相应的测测试计划划。全过程管管控所有缺陷陷和经过过评审的的需求都都必须在在JIRA上登登记,否
6、否则不予予开发。开发计划划通过JIRA进行精精确体现现。片区人员员可以通通过JIRA实实时跟踪踪产品开开发进度度。方便后续续各类工工作量的的统计。三、利用用代码重重构来提提高代码码质量重构(Refactoring):是对软软件内部部结构的的一种调调整,目目的是在在不改变变外部行行为的前前提下,提高其其可理解解性,降降低其修修改成本本为什么重重构(1)改进软件件的设计计。程序员对对代码所所做的为为了满足足短期利利益代码码改动,或再没没有完全全清楚增增个架构构下的改改动,都都很容易易是代码码失去它它的清晰晰结构,偏离需需求或设设计。而而这些改改动的积积累很容容易使代代码偏离离它原先先设计的的初衷而
7、而变得不不可立即即和无法法维护。重构则帮帮助重新新组织代代码,重重新清晰晰的体现现结构和和进一步步改进设设计。为什么重重构(2)提高代码码质量,更易被被理解容易理解解的代码码可以很很容易的的维护和和做进一一步的开开发。即即使对写写这些代代码的程程序员本本身,容容易理解解代码也也可以帮帮助容易易地做修修改。程程序代码码也是文文档。而而代码首首先是写写给人看看的,让让后才是是给计算算机看的的。重构帮助助尽早的的发现错错(Bugs)重构是一一个codereview和反馈馈的过程程。在另另一个时时段重新新审视自自己或别别人代码码,可以以更容易易的发现现问题和和加深对对代码的的理解。重构是一一个良好好的
8、软件件开发习习惯。为什么重重构(3)重构可以以提高开开发速度度重构对设设计和代代码的改改进,都都可以有有效的提提高开发发速度。好的设设计和代代码质量量实体提提高开发发速度的的关键。在一个个有缺陷陷的设计计和混乱乱代码基基础上的的开发,即使表表面上进进度较快快,但本本质是试试延后对对设计缺缺陷的发发现和对对错误的的修改,也就是是延后了了开发风风险,最最终要在在开发的的后期付付出更多多的时间间和代价价。项目的维维护成本本远高于于开发成成本.何时重构构?添加或者者修改功功能时一一并重构构为了增加加一个新新的功能能或者修修改原有有的功能能,程序序员需要要首先读读懂现有有的代码码。修补错误误时一并并重构
9、为了修复复一个Bug,程序员员需要读读懂现有有的代码码。Code Review时一一并重构构何时不该该重构?代码太混混乱,设设计完全全错误。与其Refactor,不不如重写写。明天是DeadLine永远不要要做Last-Minute-Change。推推迟重构构,但不不可以忽忽略,即即使进入入产品期期的代码码都正确确的运行行。重构方法法介绍:提取函函数(1)Stringname= request.getParameter(Name);if( name!=null&name.length() 0).Stringage =request.getParameter(Age);if( age!=null
10、 & age.length() 0).Stringname= request.getParameter(Name);if( !isNullOrEmpty( name).Stringage =request.getParameter(Age);if( !isNullOrEmpty( age) ).private booleanisNullOrEmpty( final Stringstring)if(string != null&string.length() 0)returntrue;elsereturnfalse;重构方法法介绍:提取函函数(2)提取函数数是我最最常用的的重构手手法之一一。当我
11、我看见一一个过长长的函数数或者一一段需要要注释才才能让人人理解用用途的代代码,我我就会将将这段代代码放进进一个独独立的函函数中。有数个原原因造成成我喜欢欢简短而而有良好好命名的的函数。首先,如果每每个函数数的粒度度都很小小,那么么函数之之间彼此此复用的的机会就就更大;其次,这会使使高层函函数读起起来就像像一系列列注释;再者,如果函函数都是是细粒度度,那么么函数的的覆写(override)也会会更容易易些:的确,如如果你习习惯了看看大型函函数,恐恐怕需要要一段时时问才能能适应达达种新风风格,而而且只有有当你能能给小型型函数很很好地命命名时,它们才才能真正正起作用用,所以以你需要要在函数数名称下下
12、点功夫夫,一个个函数多多长才算算合适?在我看看来.长长度不是是问题,关键在在于函数数名称和和函数本本体之间间的语义义距离,如果提提炼动作作可以强强化代码码的清晰晰度,那那就去做做,就是是函数名名称比提提炼出来来的代码码还长也也无所谓谓。重构方法法介绍:去除临临时变量量(1)重构方法法介绍:去除临临时变量量(2)我喜欢尽尽量除去去函数内内的临时时变量。临时变变量往往往形成问问题,它它们会导导致大量量参数被被传来传传去,而而其实完完全没有有这种必必要。你你很容易易失去它它们的踪踪迹,尤尤其在长长长的函函数之中中更是如如此。而而且,临临时变量量的存在在,往往往会阻碍碍提取函函数等其其他重构构手法的的
13、进行。重构方法法介绍:重新命命名函数数(1)publicStringgetItemName(int itemSort,StringitemName)return+itemSort+、+itemName; publicStringformatItemName(int itemSort,StringitemName)return+itemSort+、+itemName; 重构方法法介绍:重新命命名函数数(2)我极力提提倡的一一种编程程风格就就是:将将复杂的的处理过过程分解解成小函函数。但但是,如如果做得得不好,这会使使你费尽尽周折却却弄不清清楚这些些小函数数各白的的用途、.要避避免这种种麻烦,关键
14、就就在于给给函数起起一个好好名称;函数的的名称应应该准确确表达它它的用途途;给函函数命名名有一个个好办法法。首先先考虑应应该给这这个函数数写上一一句怎样样的注释释,然后后想办法法将注释释变成函函数名称称。人生不如如意十之之八九:你常常常无法第第一次就就给函数数起一个个好名称称,这时时候你可可能会想想,就这这样将就就着吧,毕竟只只是一个个名称而而已。当当心!这这是恶魔魔的召唤唤,是通通向混乱乱之路,千万不不要被它它诱惑!如果你你看到一一个函数数名称不不能很好好地表达达它的用用途,应应该马上上加以修修改。记记住,你你的代码码首先是是为人写写的,其其次才是是为计算算器写的的。而人人需要良良好名称称的
15、函数数。想想想过去曾曾经浪费费的无数数时间吧吧,如果果给每个个函数都都起一个个良好的的名称,也许你你可以节节约好多多时间。取一个个好名称称并不容容易,需需要经验验,要想想成为一一个真正正的编程程高手,取名称称的水平平是至关关重要的的。重构方法法介绍:以多态态取代条条件表达达式(1)publicclassPlanUtilpublicvoidsetPlanState(int planYear,intitemId,int dataType)switchdataTypecase 1:setPrePlanState(planYear,itemId);case 2:setColPlanState(plan
16、Year,itemId);case 3:setAftPlanState(planYear,itemId);default:thrownewRuntimeException(不正确确的计划划类型:+dataType);/.更新新建议计计划状态态publicvoidsetPrePlanState/.更新新综合计计划状态态publicvoidsetColPlanState./.更新新开工计计划状态态publicvoidsetAftPlanState.publicclassPlanUtilpublicstatic PlanUtilcreate(int dataType)switch(dataType)
17、case 1:return newPrePlanUtil();case 2:return newColPlanUtil();case 3:return newAftPlanUtil();default:throw newRuntimeException(不不正确的的计划类类型:+dataType);publicabstractvoidsetPlanState(int planYear,intitemId,int dataType);publicabstractvoidsavePlan(int planYear,intitemId,int dataType);重构方法法介绍:以多态态取代条条件表
18、达达式(2)/保存存计划数数据publicvoidsavePlan(int planYear,intitemId,int dataType)switchdataTypecase 1:savePrePlan(planYear,itemId);case 2:saveColPlan(planYear,itemId);case 3:saveAftPlan(planYear,itemId);default:thrownewRuntimeException(不正确确的计划划类型:+dataType);/.保存存建议计计划数据据publicvoidsavePrePlan/.保存存综合计计划数据据public
19、voidsaveColPlan/.保存存开工计计划数据据publicvoidsaveAftPlanpublicclassPrePlanUtilextends PlanUtilpublicvoidsetPlanState(int planYear,intitemId,int dataType).更更新建建议计划划状态方方法publicvoidsavePlan(int planYear,intitemId,int dataType)保存存建议计计划数据据方法publicclassColPlanUtilextends PlanUtilpublicvoidsetPlanState(int planYe
20、ar,intitemId,int dataType).更更新综综合计划划状态方方法publicvoidsavePlan(int planYear,intitemId,int dataType)保存存综合计计划数据据方法重构方法法介绍:以多态态取代条条件表达达式(3)/调用用更新计计划状态态的方法法planUtil.setPlanState(year,itemId,dataType);/调用用保存计计划数据据的方法法planUtil.savePlanyear,itemId,dataType);publicclassAftPlanUtilextends PlanUtilpublicvoidsetP
21、lanState(int planYear,intitemId,int dataType).更更新开开工计划划状态方方法publicvoidsavePlan(int planYear,intitemId,int dataType)保存存开工计计划数据据方法/调用用PlanUtilplanUtil= PlanUtil .create(dataType);/调用用更新计计划状态态的方法法planUtil.setPlanState(year,itemId,dataType);/调用用保存计计划数据据的方法法planUtil.savePlan(year,itemId,dataType);重构方法法介绍
22、:以多态态取代条条件表达达式(4)多态最根根本的好好处就是是:如果果你需要要根据对对象的不不同型别别而采取取不同的的行为,多态使使你不必必编写明明显的条条件式。正因为为有了多多态,所所以你会会发现:针对对typecode(型别别码)而而写的switch语语句,以以及针针对typestring(型别别名称字字符串)而写的的if-then-else语句在面向向对象程程序中很很少出现现。多态能够够给你带带来很多多好处。如果同同一组条条件式在在程序许许多地点点出现,那么使使用多态态的收益益是最大大的。使使用条件件式时,如果你你想添加加一种新新型别,就必须须杳找并并更新所所有条件件式。但但如果改改用多态
23、态,只需需建一个个新的subclass并在在其中提提供适当当的函数数就行了了。class用户不不需要了了解这个个subclass,这就大大大降低低了系统统各部分分之间的的耦合程程度,使使系统升升级.更更加容易易。重构方法法介绍:以委托托取代继继承(1)/继承承解决方方案publicclassBusPlanManagerServiceImplpublicvoidsetPlanState(int planYear,intitemId,int dataType).更更新建建议计划划状态方方法publicvoidsavePlan(int planYear,intitemId,int dataType)
24、保存存建议计计划数据据方法publicclassPrePlanServiceextends BusPlanManagerServiceImpl.publicclassColPlanServiceextends BusPlanManagerServiceImpl.publicclassAftPlanServiceextends BusPlanManagerServiceImpl./委托托解决方方案publicclassBusPlanManagerServiceImplpublicvoidsetPlanState(int planYear,intitemId,int dataType)PlanUt
25、ilplanUtil= PlanUtil .create(dataType);/调用用更新计计划状态态的方法法planUtil.setPlanState(year,itemId,dataType);publicvoidsavePlan(int planYear,intitemId,int dataType)PlanUtilplanUtil= PlanUtil .create(dataType);/调用用更新计计划状态态的方法法planUtil.savePlan(year,itemId,dataType); 重构方法法介绍:以委托托取代继继承(2)继承是一一件很棒棒的事,但有时时候它并并不是你你
26、要的。常常你你会遇到到这样的的情况:一开始始你继承承了一个个class,随后后发现superclass中的许许多操作作井不真真正适用用于subclass。这种种情况下下你所拥拥有的接接口并末末真正反反映出class的功功能。或或者,你你可能发发现你从从superclass中继继承了一一大堆subclas并不需需要的数数据,抑抑或者你你可能发发现superclass中中的某些些protected函数对对subclass并并没有什什么意义义。你可以选选择容忍忍,并接接受传统统说法:subclass可可以只使使用superclas、功功能的一一部分。但这样样做的结结果是:代码传传达的信信息与你你的意
27、图图南辕北北辙,这这是一种种混淆,你应该该将它去去除。如如果以委委托取代代继承,你可以以更清楚楚地表明明:你只只需要受受托类的的一部分分功能。接口中中的哪一一部分应应该被使使用,哪哪一部分分应该被被忽略,完全由由你主导导控制。这样做做的成本本则是需需耍额外外写出委委托函数数,但这这些函数数都非常常简单,极少可可能出错错。重构方法法介绍:引入参参数对象象(1)publicListgetYearPlanList(String operatorID, StringplanYear,StringiSeason,String planType,StringdataType).publicListgetL
28、astYearPlanList(String operatorID, StringplanYear,StringiSeason,String planType,StringdataType)publicvoidfillPlanData(String operatorID, StringplanYear,StringiSeason,String planType,StringdataType)PlanDataplanData=newPlanData();planData.setYeraPlanList(getYearPlanList (operatorID,planYear,iSeason,pl
29、anType,dataType);planData.setLastYeraPlanList(getLastYearPlanList(operatorID,planYear, iSeason,planType,dataType);publicclassPlanParamObjprivate StringoperatorID;private StringplanYear;private StringiSeason;private StringplanType,;private StringdataType;publicPlanParamObj(String operatorID, Stringpl
30、anYear,StringiSeason,String planType,StringdataType)this.operatorID=operatorID;this.planYear=planYear;this.iSeason=iSeason;this.planType=planType;this.dataType=dataType;重构方法法介绍:引入参参数对象象(2)publicListgetYearPlanList(PlanParamObjparamObj).publicListgetLastYearPlanList(PlanParamObjparamObj).publicvoidfi
31、llPlanData(String operatorID, StringplanYear,StringiSeason,String planType,StringdataType)PlanParamObjparamObj=newPlanParamObj (operatorID,planYear,iSeason,planType,dataType);PlanDataplanData=newPlanData();planData.setYeraPlanList(getYearPlanList (paramObj);planData.setLastYeraPlanList(getLastYearPl
32、anList(paramObj );重构方法法介绍:引入参参数对象象(3)你常会看看到特定定的数组组参数总总是一起起被传递递。可能能有好几几个函数数都使用用这一组组参数,这些函函数可能能隶属同同个class,也可可能隶属属不同的的classes。这这样一组组参数就就是所谓谓的dataClump(数据泥泥团),我们可可以运用用一个对对象包装装所有这这些数据据,再以以该对象象取代它它们。哪哪伯只是是为了把把这些数数据组织织在一起起,这样样做也是是值得的的。本项项重构的的价值在在于缩短短了参数数列的长长度,而而你知道道,过长长的参数数列总是是难以理理解的。此外,新对象象所定义义的访问问函数还还可以使
33、使代码更更具一致致性,这这又进一一步降低低了代码码的理解解难度和和修改难难度。本项重构构还可以以带给你你更多好好处。当当你把这这些参数数组织到到起之后后,往往往很快可可以发现现一些可被移移至新建建class的行为为。通常常,原本本使用那那些参数数的函数数对那些些参数会会有一些些共通措措施,如如果将这这些共通通行为移移到新对对象中,你可以以减少很很多重复复代码重构方法法介绍:函数迁迁移(1)publicclassRepUtilFuncprivate ListinitFundList().this.copyFundView(fView,planView); /汇总投投资计划划数据private v
34、oidcopyFundView(FundViewfView,PlanViewplanView)fView.setFund(fView.getFund()+planView.getFund();fView.setUpprefund(fView.getUpprefund()+planView.getUpprefund();fView.setDownprefund(fView.getDownprefund()+planView.getDownprefund();publicclassRepUtilFuncprivate ListinitFundList().fView.copyFundView(pl
35、anView);/汇总总投资计计划数据据重构方法法介绍:函数迁移移(2)publicclassFundView privatedoublefund;privateStringupprefund;privateStringdownprefund;getset方法publicclassFundView privatedoublefund;privateStringupprefund;privateStringdownprefund;getset方法publicvoidcopyFundView(PlanViewplanView)this.setFund(this.getFund()+planView
36、.getFund();this.setUpprefund(this.getUpprefund()+planView.getUpprefund();this.setDownprefund(this.getDownprefund()+planView.getDownprefund();重构方法法介绍:函数迁移移(3)函数迁迁移是是重构理理论的支支柱。如如果一个个class有有太多行行为,或或如果一一个class与另一一个class有太多多合作而而形成高高度耦合合,我就就会迁移移函数。通过这这种手段段,我可可以使系系统中的的classes更简简单,这这些classes最最终也将将更干净净利落地地实现
37、系系统交付付的任务务。常常常我会浏浏览class的所有有函数,从中寻寻找这样样的函数数,使用用另一个个对象的的次数比比使用自自己所驻驻对象的的次数还还多,就就会进行行函数迁迁移。重构方法法介绍:将过程程化设计计转换为为面向对对象设计计有时间的的话用一一个实际际例子进进行展示示。四、测试试驱动开开发方法法简介测试驱动动开发(TestDrivenDevelopment,英文缩缩写TDD)是是极限编编程的一一个重要要组成部部分,它它的基本本思想就就是在开开发功能能代码之之前,先先编写代代码的单单元测试试用例。也就是是说在明明确要开开发某个个功能后后,首先先思考如如何对这这个功能能进行测测试,并并完成
38、测测试用例例的编写写,然后后编写相相关的代代码满足足这些测测试用例例。循环环进行添添加其他他功能,直到完完成全部部功能的的开发。代码整整洁可用用(clean codethatworks)是是测试试驱动开开发所追追求的目目标。测试驱动动开发优优点(1)需求向来来就是软软件开发发过程中中感觉最最不好明明确描述述、易变变的东西西。这里里说的需需求不只只是指用用户的需需求,还还包括对对代码的的使用需需求。很很多开发发人员最最害怕的的就是后后期还要要修改某某个类或或者函数数的接口口进行修修改或者者扩展,为什么么会发生生这样的的事情就就是因为为这部分分代码的的使用需需求没有有很好的的描述。测试驱驱动开发发
39、就是通通过编写写测试用用例,先先考虑代代码的使使用需求求(包括括功能、过程、接口等等),而而且这个个描述是是无二义义的,可可执行验验证的。通过编写写这部分分代码的的测试用用例,对对其功能能的分解解、使用用过程、接口都都进行了了设计。而且这这种从使使用角度度对代码码的设计计通常更更符合后后期开发发的需求求。可测测试的要要求,对对代码的的内聚性性的提高高和复用用都非常常有益。因此测测试驱动动开发也也是一种种代码设设计的过过程。开发人员员通常对对编写文文档非常常厌烦,但要使使用、理理解别人人的代码码时通常常又希望望能有文文档进行行指导。而测试试驱动开开发过程程中产生生的测试试用例代代码就是是对代码码
40、的最好好的解释释。测试驱动动开发优优点(2)快乐工作作的基础础就是对对自己有有信心,对自己己的工作作成果有有信心。当前很很多开发发人员却却经常在在担心:“代码码是否正正确?”“辛苦苦编写的的代码还还有没有有严重bug?”“修修改的新新代码对对其他部部分有没没有影响响?”。这种担担心甚至至导致某某些代码码应该修修改却不不敢修改改的地步步。测试试驱动开开发提供供的测试试集就可可以作为为你信心心的来源源。当然测试试驱动开开发最重重要的功功能还在在于保障障代码的的正确性性,能够够迅速发发现、定定位bug。而而迅速发发现、定定位bug是很很多开发发人员的的梦想。针对关关键代码码的测试试集,以以及不断断完
41、善的的测试用用例,为为迅速发发现、定定位bug提供供了条件件。我的一段段功能非非常复杂杂的代码码使用TDD开开发完成成,真实实环境应应用中只只发现几几个bug,而而且很快快被定位位解决。您在应应用后,也一定定会为那那种自信信的开发发过程,功能不不断增加加、完善善的感觉觉,迅速速发现、定位bug的的能力所所感染,喜欢这这个技术术的。测试驱动动开发基基本过程程明确当前前要完成成的功能能。可以以记录成成一个TODO列列表。快速完成成针对此此功能的的测试用用例编写写。测试代码码编译不不通过。编写对应应的功能能代码。测试通过过。对代码进进行重构构,并保保证测试试通过。循环完成成所有功功能的开开发测试驱动
42、动开发案案例(1)需求:实实现Fibonacci数列列Fibonacci数数列简介介:Fibonacci数列列从第0项开始始依次为为0,1,1,2,3,5,8的数列列,它存存在如下下特点:第0,1个数数为0,1。从从第2个个数开始始,该数数是前面面两个数数之和。测试驱动动开发案案例(2)先编写测测试代码码 :importjunit.framework.TestCase;publicclassFibonacciTestextendsTestCasepublicvoidtestFibonacci()FibUtil fb =newFibUtil();编写完测测试代码码之后在在Eclipse中运运行该
43、测测试类,发现Junit运行行出错(显示了了一条红红色杠) 这是是在预料料之中,因为我我们还没没有编写写FibUtil类。测试驱动动开发案案例(3)为了使测测试通过过,那么么下面开开始编写写FibUtil类publicclassFibUtil然后再次次运行测测试类。这时会会发现测测试成功功。测试驱动动开发案案例(4)下面增加加测试用用例,开开始测试试Fibonacci数列的的实现函函数fib:publicvoidtestFibonacci()FibUtil fb =newFibUtil();assertEquals(0,fb.fib(0);由于出现现编译错错误,所所以需要要在FibUtil类类中增加加fib方法如如下:publi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年远程监测服务合同
- 2026年佛教文化推介合同
- 2026年烘焙课程委托合同
- 2026年建筑医院古手机合同
- 电商技术开发合同
- 2025年食品安全监管信息化系统可行性研究报告
- 2025年新型抗生素的研发与市场可行性研究报告
- 2025年农村电商促进项目可行性研究报告
- 会议广告协议书
- 供商混合同范本
- 2025四川航天川南火工技术有限公司招聘考试题库及答案1套
- 2025年度皮肤科工作总结及2026年工作计划
- (一诊)成都市2023级高三高中毕业班第一次诊断性检测物理试卷(含官方答案)
- 2025年青岛市公安局警务辅助人员招录笔试考试试题(含答案)
- 2024江苏无锡江阴高新区招聘社区专职网格员9人备考题库附答案解析
- 科技园区入驻合作协议
- 冠状动脉微血管疾病诊断和治疗中国专家共识(2023版)
- GB/T 24002.1-2023环境管理体系针对环境主题领域应用GB/T 24001管理环境因素和应对环境状况的指南第1部分:通则
- GB/T 16938-2008紧固件螺栓、螺钉、螺柱和螺母通用技术条件
- C语言课程设计-商品信息管理系统
- 注塑QC工作流程
评论
0/150
提交评论