• 1. 代码检查工具张琦 2011.8
  • 2. 三、静态语法检查二、代码检查工具分类一、代码检查的目的六、一个实例的分析报告五、衡量设计质量四、静态逻辑Bug检查
  • 3. 代码检查的目的可运行易维护可靠灵活一个写代码的人提交的代码,我们对它“要求”什么呢讲述一个类(Class)自己的故事…… ---《实现模式》 [美]Kent Beck 代码的易维护性,来源于代码结构、格式、命名等的统一
  • 4. 代码检查的目的代码编制代码检查单元测试集成测试系统测试1、代码检查是“静态”过程2、代码检查重点关注编码的规范性,也关注代码错误3、代码检查以多种维度进行检查4、代码检查以量化的指标报告提供评价结论在代码提交前、执行前对代码进行质量保证5、代码检查只是质量提升的其中一个组成部分
  • 5. 代码检查的目的SVN本地 代码检查 单元测试 结果设计人员开发人员OK!!Upload审核 修改 认可抽取、检查、执行自动 检查 结果复测!! 生成报告评价!!!!静态代码检查工具的应用在开发客户端也在持续集成服务端持续集成服务
  • 6. 三、静态语法检查二、代码检查工具分类一、代码检查的目的六、一个实例的分析报告五、衡量设计质量四、静态逻辑Bug检查
  • 7. 代码检查工具的分类静态语法检查CheckStylePMD静态逻辑Bug检查FindBugs设计质量衡量JDepend
  • 8. CheckStyle:目前最广泛使用的代码检查工具,代码格式检查工具,以之可以构建定制化的代码规范模板 可以自定义代码规范模板,可以让开发者规约自己的代码,也可以作为衡量代码定态质量的标准 PMD:静态分析Java代码错误的工具,在Runtime前对代码进行错误评估 包含 16 个规则集,对命名、未使用的代码、设计、代码尺寸、终结函数、耦合等进行检查,当然它也可以自定义规则集 可以对JSP页面进行检查,但是规则集较少 两者更多的关注代码格式造成的缺陷、风险和问题,同一个报警可能出现在两者的检查交集中 两者都可以集成到开发客户端的Eclipse环境中,也可以与Maven集成生成代码质量评估报告 静态语法检查
  • 9. FindBugs:一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题 FindBugs发现的问题,大部分都是在Runtime过程中,会造成程序异常、错误的 FindBugs可以联系class所在包的上下文,对代码进行穿透检查,对隐藏的比较深层次的逻辑错误、资源操作问题等进行报警 当然,FindBugs可以被集成到Eclipse开发环境中,也可以集成到Maven中,生成报告复杂逻辑错误资源读写Null指针较为健壮的工作产品更加专注于逻辑风险、错误 例如:可能发生的无限循环 效率低下的数据结构访问 等等……静态逻辑Bug检查
  • 10. JDepend:对每个Package的依赖性进行度量 JDepend可自动度量某个设计在以下三个方面的质量 可扩展性(Extensibility) 可重用性(Reusability) 可管理性(Maintainability) 它采用以下的指标来进行评价 包中类和接口的数量(Number of Classes and Interfaces) 包的抽象度(Abstractness) 向心耦合(Afferent Couplings (Ca)) 离心耦合(Efferent Couplings (Ce)) 包的不稳定程度(Instability (I)) 抽象程度与稳定程度的平衡关系(Distance from the Main Sequence (D)) 包的循环依赖度(Package Dependency Cycles)设计质量衡量
  • 11. 三、静态语法检查二、代码检查工具分类一、代码检查的目的六、一个实例的分析报告五、衡量设计质量四、静态逻辑Bug检查三.二、PMD三.一、CheckStyle
  • 12. CheckStyle的安装在Eclipse IDE中安装CheckStyle插件,进行开发客户端检查两种安装途径: 手工安装: 从http://eclipse-cs.sourceforge.net/上查询Eclipse的CheckStyle插件,下载并放置到%ECLIPSE_HOME%\plugins目录中 在线安装: Help菜单Software UpdateFind And Install 选择Search for New Features New Remote Site,输入一个站点名称和地址(http://eclipse-cs.sourceforge.net/update),按提示安装客户端检查是代码提交到SVN前的关键过程, 建议采用“阻塞检查”方式,即关键问题修改完毕前不能提交SVN
  • 13. 使用CheckStyle为项目激活CheckStyle检查: Project[项目]Properties[属性]CheckStyle[属性项]CheckStyle Active for this project选中 选定使用的检查规则集: Sun Java编码规范规则 Sun Java编码规范Eclipse版本 胜利软件编码规范Eclipse版本(从2中继承定制生成)规则集名称说明JavaDoc Comments对代码的JavaDoc注释进行检查Naming Conventions检查命名规范性:大小写、变量/常量/方法命名Imports重点对导入进行检查,导入冗余、重复、未用等Size Violations对类、方法长度进行检查:行长度、文件长度、方法长度WhiteSpaces重点对换行和空白进行控制,如Tab长度和位置等Modifiers检查修饰符顺序、位置合理性建议Coding Problems检查常见的语法错误,空语句、循环变量冲突、赋值冲突激活后,编译过程每次都会包含检查过程
  • 14. 使用CheckStyle从首选项中导入 胜利软件编码规范 检查模板
  • 15. 使用CheckStyle项目开启 CheckStyle 检查选项
  • 16. 使用CheckStyleXXX类检查 提示: 问题提示 所在行 Problems视图
  • 17. 三、静态语法检查二、代码检查工具分类一、代码检查的目的六、一个实例的分析报告五、衡量设计质量四、静态逻辑Bug检查三.二、PMD三.一、CheckStyle
  • 18. PMD的安装两种安装途径: 手工安装: 从http://pmd.sourceforge.net/上查询Eclipse的PMD插件,下载并放置到%ECLIPSE_HOME%\plugins目录中 在线安装: Help菜单Software UpdateFind And Install 选择Search for New Features New Remote Site,输入一个站点名称和地址(http://pmd.sourceforge.net/eclipse),按提示安装从功能上与CheckStyle比较,PMD更多的集中在预先的代码缺陷检测上,而且PMD更加突出了具体开发框架的检测,如Jakarta-Log、JUnit,同时比CheckStyle增加了对代码访问安全性的检查
  • 19. 使用PMD为项目激活PMD检查: Project[项目]Properties[属性]PMD[属性项]Enable PMD选中 选定使用哪些检查规则 在List列表中,选择本项目使用PMD的哪些规则规则集名称说明Basic规则检查代码结构,如空的try catch块,错误的类型转换等括号规则检查if else、for、while、代码块的括号Size规则集检查带代码超长,类、方法、代码块的超长Clone规则检查克隆实现的完整度,避免脏克隆Finalizer规则检查finalize方法是否为空或者是否明确效用finalizeJakarta日志规则检查对Common-logging框架的不正确使用移植规则检查代码JDK多版本切换的移植性Sun安全代码规则检查Sun的代码安全建议,如应该返回数组的副本耦合规则检查不必要的导入,API返回实现类而不是接口
  • 20. 使用PMD首选项中设置PMD规则集
  • 21. 使用PMD项目属性页中设置PMD激活
  • 22. 使用PMDPMD提供了有关检测重复代码的功能,如检测复制粘贴的代码,CPD(Cut-and-Paste Detector)可以完成这个功能重复的代码是我们重构的重要目标和重要任务
  • 23. 三、静态语法检查二、代码检查工具分类一、代码检查的目的六、一个实例的分析报告五、衡量设计质量四、静态逻辑Bug检查四.一、FindBugs
  • 24. FindBugs的安装两种安装途径: 手工安装: 从http://findbugs.sourceforge.net/downloads.html上查询Eclipse的FindBugs插件,下载并放置到%ECLIPSE_HOME%\plugins目录中 在线安装: Help菜单Software UpdateFind And Install 选择Search for New Features New Remote Site,输入一个站点名称和地址(http://findbugs.cs.umd.edu/eclipse),按提示安装FindBugs与CheckStyle和PMD不同,侧重于检测潜在程序错误和风险 FindBugs采用“错误模式(Bug Pattern)”匹配的方式进行扫描
  • 25. 使用FindBugs为项目激活PMD检查: Project[项目]Properties[属性]FindBugs[属性项]Enable project specific settings和Run Automatically 项目设定为Building Automatically 选定使用哪些检查类型 在List列表中,选择本项目使用FindBugs的哪些检查类型规则分类名称说明Correctness(正确性)不正确的代码:死循环、空指针访问、参数未初始化BadPractice(不良实践)违反常规开发规则:未关闭资源、异常抛出不截获Performance(性能)代码可能的性能问题,重复对象过多、字符串循环+Dodgy(不可靠)未使用的变量、奇怪和未检查的类型转换等Multithreaded correctness(多线程正确性)多线程调用、同步问题这样每次修改代码,都会自动FindBugs
  • 26. 使用FindBugs首选项中设置FindBugs
  • 27. 使用FindBugs项目属性页中设置FindBugs激活
  • 28. 使用FindBugs对选定项目启动FindBugs检查
  • 29. 使用FindBugs在FindBugs透视图中查看检查结果
  • 30. 三、静态语法检查二、代码检查工具分类一、代码检查的目的六、一个实例的分析报告五、衡量设计质量四、静态逻辑Bug检查五.一、JDepend
  • 31. JDepend的安装两种安装途径: 手工安装: 从http://andrei.gmxhome.de/jdepend4eclipse/links.html下载JDepend4Eclipse,放置到%ECLIPSE_HOME%\plugins目录中,重新启动Eclipse,完成安装
  • 32. 使用JDepend首选项中设置JDepend
  • 33. 使用JDepend选中项目中源码目录或者代码包,执行JDepend检查
  • 34. 使用JDepend在JDepend透视图中查看各个设计评价指标情况,分析设计质量
  • 35. 三、静态语法检查二、代码检查工具分类一、代码检查的目的六、一个实例的分析报告五、衡量设计质量四、静态逻辑Bug检查
  • 36. 一个实例的分析报告这个实例是胜利软件工作流管理系统V3.0引擎部分这个实例是开发阶段中代码检查的一个快照这个实例是从持续集成服务器中生成出来的这个实例包含CheckStyle、PMD、FindBugs、JDepend这个实例不仅仅对项目经理有意义,还有谁会获益?这个实例说明分析数据对开发和设计才有巨大价值?亡羊补牢 犹未为晚爽!靠!工作流V3.0代码检查结果工作流V3.0代码检查分析
  • 37. Project A一个实例的分析报告测试 数据库SQL 脚本核心控制器环境构建服务版本抽取服务报告生成服务测试执行服务静态检查服务配置文件Project BSQL 脚本Test Case配置文件Project ……Test CaseBiz CodeBiz CodeProject CSQL 脚本配置文件Test CaseBiz CodeSVN RepositoryStep 1 从SVN中取得CodeStep 2 根据配置构建测试上下文Step 3 静态代码检查Step 4 动态单元测试Step 5 生成结果报告、保留测试现场Step 2.1 ReUsable DB ContextStep 0 环境配置主控 数据库结果文件Step 3.1 静态检查结果Step 4.1 单元测试结果执行日志WebSite日志日志
  • 38. 谢谢大家