LOGO佳都新太提高代码质量Java篇目录(一)除了编码,开发还可以做什么编码规范单元测试代码评审静态检查持续集成目录(二)补充动态检查缺陷管理性能测试WEB前端分析自动化测试除了编码,开发还可以做什么现状项目开发过程中,由于开发人员的经验、代码风格各不相同,以及缺乏统一的标准和管理流程,往往导致整个项目的代码质量较差,难于维护,需要较大的测试投入和周期等问题。措施可以采用以下五个步骤来保证和提高整个项目的代码质量:统一编码规范、代码样式;静态代码分析(staticcodereview);单元测试;持续集成;代码评审和重构(Review&Refactor)。下面将针对每个步骤和其所使用的工具、方法进行详细描述。代码质量保证步骤ContentTitle编码规范规范统一的编码能提高项目代码的可读性和可维护性,编码规范主要应包含以下几个方面:一般规则和格式规范。例如代码缩进、程序块规范、每行最大代码长度等。命名规则。例如包名、类名、变量、方法、接口、参数等命名规范文档规范。例如类文件头声明、类注释、成员变量和方法注释等规范。编程规范。例如异常、并发、多线程等方面的处理方式。其他规范。例如日志格式、属性文件格式,返回值和消息格式。用eclipse控制代码样式(一)一旦编码规范确定,就可以利用Eclipse来控制代码样式和格式。点击Eclipse的Windows-Preference菜单项,在打开的Preferences对话框的左侧栏中找到Java节点下的子项CodeStyle,该项和它的子项允许您对Java代码的样式进行控制:用eclipse控制代码样式(二)可以在Eclipse提供的默认代码格式配置的基础上建立自定义的格式。在Formatter面板中,点击New,输入新的名字并选择一个默认的配置作为初始化格式,如图所示:用eclipse控制代码样式(三)设置风格如图所示:代码静态检查_CheckStyleCheckStyle用来检查代码格式、规范、风格。检查并强制执行统一的代码风格;检查Javadoc;检查类、变量、方法的命名;检查类和方法的大小;检查编码错误,例如magicnumber;……代码常见问题举例:代码中的magic-number和magic-string:Strings=“0000”+Integer.toString(ch,16);0000、16的含义,作者几周后就忘记了。CheckStyle的安装配置(一)CheckStyle插件地址。自动安装地址:下载地址:安装后出现:CheckStyle的安装配置(二)配置项说明:CheckStyle的安装配置(三)CheckStyle检查结果:其它工具用于javascript静态检查的工具:Jslint-TheJavaScriptCodeQualityTool代码静态检查_FindBugsFindBugs是一个java代码的静态代码分析工具,用来发现那些潜在的、常见的、很难被发现的bug。与其他静态分析工具不同,FindBugs不注重样式或者格式,它试图只寻找真正的缺陷或者潜在的性能问题。如NullPoint空指针检查、没有合理管理资源等。Findbugs插件地址。自动安装地址:下载地址:的使用配置选项:Findbugs的使用运行,右键项目执行“FindBugs”操作:检查结果:单元测试单元测试单元测试是最小粒度的测试,以测试某个功能或代码块,一般由程序员来做。用例设计和评审设计阶段需要具体考虑要对哪些代码单元进行测试,被测单元之间的关系,测试策略,以及单元测试用例设计等,并最终输出《单元测试用例设计》文档,用来指导具体的单元测试执行。在用例设计完成之后,下一步的工作就是进行测试用例的评审。个人的理解和经验始终是有限的,用例评审可以借集体之力,对用例设计进入查漏补缺,进一步保证测试用例的有效性。单元测试_JUnitJUnitJUnit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。它是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试,回归测试。下载地址eclipse自带了JUnit,完整安装包的下载地址:核心结构JunitJUnit测试开发(一)下面举例描述怎样对一个类编写单元测试代码,待测试的类:JUnit测试开发(二)JUnit3.8测试类:JUnit测试开发(三)JUnit4.0测试类:JUnit测试开发(四)setUp和tearDown方法:Junit断言(一)断言Assert方法:Junit断言(二)断言Assert方法:在Eclipse上执行Junit(一)下面说明怎样在eclipse上执行Junit单元测试添加一个需要测试的类Hello:在Eclipse上执行Junit(二)选中需要测试的类,右键点击,选择New-JUnitTestCase,如图:在Eclipse上执行Junit(三)新建测试类:在Eclipse上执行Junit(四)下一步选择要测试的方法:在Eclipse上执行Junit(五)完成HelloTest的Abs方法:在Eclipse上执行Junit(六)执行测试程序,右键,RunAs-JUnitTest,就可以看到JUnit测试结果:绿色表示测试通过,只要有1个测试未通过,就会显示红色并列出未通过测试的方法。单元测试_EasyMock模拟对象技术在实际项目中,开发人员自己的代码往往需要和其他的代码模块或系统进行交互,但在测试的过程中,这些需要被调用的真实对象常常很难被实例化,利用一个模拟对象来模拟我们的代码所依赖的真实对象,来帮助完成测试,提高测试覆盖率。常见的模拟技术模拟技术有很多种,如jMock,EasyMock,Mockito,PowerMock等等,下面用EasyMock举例说明如何模拟对象。EasyMock(一)下载地址:使用样例:看一个用户验证的servlet:publicclassLoginServletextendsHttpServlet{protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringusername=request.getParameter(username);Stringpassword=request.getParameter(password);EasyMock(二)//校验用户名和密码if(admin.equals(username)&&123456.equals(password)){ServletContextcontext=getServletContext();RequestDispatcherdispatcher=context.getNamedDispatcher(dispatcher);dispatcher.forward(request,response);}else{thrownewRuntimeException(Loginfailed.);}}}EasyMock(三)为测试doPost()方法,需要模拟HttpServletRequest等对象,以便脱离J2EE容器来测试这个Servlet。建立TestCase,名为LoginServletTest:publicclassLoginServletTestextendsTestCase{}测试当用户名和口令验证失败的情形:publicvoidtestLoginFailed()throwsException{//创建mock对象MockControlmc=MockControl.createControl(HttpServletRequest.class);HttpServletRequestrequest=(HttpServletRequest)mc.getMock();EasyMock(四)//设置mock参数request.getParameter(username);//期望下面的测试将调用此方法,参数为usernamemc.setReturnValue(admin,1);//期望返回值为admin,仅调用1次request.getParameter(password);//期望下面的测试将调用此方法,参数为passwordmc.setReturnValue(1234,1);//期望返回值为1234,仅调用1次//表示录制完毕mc.replay();EasyMock(五)try{servlet.doPost(request,null);fail(Notcaughtexception!);}catch(RuntimeExceptionre){assertEquals(Loginfailed.,re.getMessage());}//verify:mc.verify();}运行JUnit,测试通过!表示我们的Mock对象正确工作了!单元测试_测试覆盖率分析为了衡量单元测试的质量和覆盖的范围,需要对单元测试的代码进行测试覆盖分析。具体采用哪些指标可以根据项目的实际情况来定,以避免因过高的指标增加了代码开发人员的工作量而影响了项目整体的进度。。业内比较常用的工具有:1、Cobertura,对应的eclipse插件:eCobertura。2、EclEmma是一款基于EMMA的Eclipse插件,方便在EclipseIDE中进行测试覆盖率分析。插件下载地址:测试覆盖率分析(一)下面说怎样在eclipse上执行测试覆盖率分析:先安装插件EclEmma,然后在测试用例写好后,可以在右键点击测试类,选择CoverageAs-JUnitTest.Eclipse测试覆盖率分析(二)单元测试执行完后,Coverage视图中会显示所选择的测试的覆盖率。双击打开某一具体的类后,可以看到高亮显示的覆盖分析结果,如图所示。红色代表测试没有覆盖到该行,黄色表示部分覆盖,绿色的行表示该行在本次测试中被覆盖到。Eclipse测试覆盖率分析(三)在Coverage视图中可以通过点击鼠标右键将测试覆盖分析的结果导出成需要的格式,例如HTML。持续集成持续集成(ContinuousIntegration)是利用一系列的工具、方法和规则,做到快速的构建开发代码,自动的测试化,来提高开发代码的效率和质量。持续集成的提出如果项目开发的规模比较小,比如一个人的项目,如果它对外部系统的依赖很小,那么软件集成不是问题,但是随着软件项目复杂度的增加(即使增加一个人),就会对集成和确保软件组件能够在一起工作提出了更多的要求-要早集成,常集成。早集成,频繁的集成帮助项目在早期发现项目风险和质量问题,如果到后期才发现这些问题,解决问题代价很大,很有可能导致项目延期或者项目失败。持续集成持续集成的常见做法是:持续集成框架+版本管理器+构建工具。1、持续集成框架常用的有:Hudson(jenkins)、Continuum、CruiseControl等。2、版本管理器常用的有:ClearCase、Wincvs、SVN等。3、构建工具常用的有:Ant、Maven。后面主要以SV