注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

Java静态代码检查checkstyle  

来自孔庆云kevin   2013-04-03 17:47:33|  分类: 测试工具 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1     背景

Java软件开发过程中,团队往往需要花费大量的时间和精力发现并修改代码Bug,同时几乎没有任何一个软件,在其整个生命周期中,均有最初的开发人员来维护,所以代码的可读性、可维护性也是判断代码质量的重要指标,为了提高代码的可读性、可维护性,我们会制定相应的一些编码规范。新员工入职时我们会要求按照规范编写代码,同时我们也会对代码进行review,但是代码Review部分工作我们希望能通过工具来自动完成,提高工作效率。

2    目标

通过静态代码检查,希望最终达到下面的一些目标:

1.  规范代码书写、提高可读性、可维护性

2.  通过自动化静态代码检查代替部分手工Review工作、提高工作效率

3.  提早发现潜在的Bug

4.  保证代码的整体质量,提高开发者水平


3    Checkstyle使用流程

1、组内制定统一的检查规则文件

2、开发人员本地使用组内的规则文件在Eclipse中进行自查

3Jenkins中新建Job,定时从svn或者github中获取最新代码进行checkstyle检查

4Jenkins中的checkstyle检查结果自动邮件通知相关人员

5、开发人员按照Jenkins的检查结果,如果存在错误则进行相应的修改提交


Checkstyle配置

4.1  Eclipse中配置checkstyle

  插件安装

1、 通过Eclispe中自动安装

EclipseàHelp->Instasll New Software 中输入下面的URL。进行安装

http://eclipse-cs.sourceforge.net/update


2、 下载安装包手工安装

可以从下面的网址下载eclispecheckstyle安装包,手工方式来安装插件,具体Eclipse的插件安装方法可以自行网上搜索。

http://sourceforge.net/projects/eclipse-cs/

    插件使用

插件的使用配置网上的资料很多,可以自行搜索一下

1、安装完插件后,在Eclipse的下面路径能找到配置选项

Windows-->Preferences-->Checkstyle

Java静态代码检查checkstyle - 网易杭州QA - 网易杭州 QA Team
 

通过界面我们可以发现Checkstyle插件中默认内置有2个执行代码检查的配置文件Sun ChecksSun Checks(Eclipse)。但是这两个文件检查的非常详细,一般的项目检查出来都会有非常多的错误警告信息,所以需要导入我们自己编写的配置文件。


2、 自定义配置文件
点击上个界面中的New按钮,在弹出的页面中Type选择External Configuration File
       Java静态代码检查checkstyle - 网易杭州QA - 网易杭州 QA Team 
设置完成后,点击ok按钮,回到第一个页面后会出现配置的这个文件,选中这个文件,选择Set as Default 设置为默认的检查文件.

  3、 针对具体Eclipse使用checkstyle
Eclipse中选中你需要代码检查的项目,右键选择properties->checkstyle

这里是针对具体的项目选择checkstyle,选中“Checkstyle active for this project”,

同时在config中,选择我们配置的QA

Java静态代码检查checkstyle - 网易杭州QA - 网易杭州 QA Team
 
4、查看结果
配置完成后,点击ok按钮,会为当前项目重新build一次,build完成后如果一些编码没有按照自定义的规则,会在代码中出现提示,鼠标移动到放大镜处会提示详细的错误信息。
Java静态代码检查checkstyle - 网易杭州QA - 网易杭州 QA Team
 


4.2  Jenkins中配置使用checkstyle

   下载checkstyle

1、 下载地址 http://sourceforge.net/projects/checkstyle/files/checkstyle/

2解压checkstyle

        当前下载了最新的5.6版本,解压生成checkstyle-5.6文件夹

checkstyle-5.6-all.jar  需要用到的主要jar
       checkstyle-author.xsl   生成检查结果的模版文件,这里使用了这个模版

   编写Ant脚本

     生成检查结果需要编写Ant脚本,Jenkins中的插件也只是解析生成的xml检查结果文件为可视化的图表,所以检查结果还是需要自己编写一个Ant脚本,不过脚本是通用的,基本上编写一次,以后所有项目都可以一直使用。

<?xml version="1.0"?> <project name="OrangeIOS" basedir="." default="checkstyle">     
<taskdef name="checkstyle" classname="com.puppycrawl.tools.checkstyle.CheckStyleTask"
classpath="checkstyle-5.6-all.jar" />
<target name="checkstyle" description="Generates a report of code convention violations.">
<mkdir dir="checkstyle" />
//调用指定的xml解析规则文件
<checkstyle config="sun_checks.xml" failureProperty="checkstyle.failure" failOnViolation="false">
//生成检查结果xml文件到指定目录,Jenkins中插件也可以使用这个xml结果文件解析为可视化图表
<formatter type="xml" tofile="checkstyle/checkstyle_report.xml" />
<fileset dir="src" includes="**/*.java" />
</checkstyle>
//通过指定的xsl模版文件生成一份html的报告,这里生成的文件用于邮件发送时附加上,另外Jenkins插件也会生成可视化的结果
<xslt in="checkstyle/checkstyle_report.xml" out="checkstyle/checkstyle_report.html"
style="checkstyle-author.xsl" />
</target>
</project>

安装Jenkins插件

1、 Jenkins上搜索安装Checkstyle Plug-in 插件

2、 Jenkins上配置buildcheckout代码库

3、 编写脚本,从指定目录下获取checkstyle需要的相关文件

          这里使用wget来获取相关checkstyle文件,可以实现不需要开发人员额外在代码中加 入相关文件即可实现静态代码检查。
  

Java静态代码检查checkstyle - 网易杭州QA - 网易杭州 QA Team
 

4、 调用执行ant脚本,生成xml结果文件

5、 配置checkstyle插件,指定生成的xml位置

Jenkins任务的Add Post-build action->Publish checkstyle analysis results

在出现的文本框中填写你在build文件中生成的xml文件放置路径

6、 Jenkins上查看生成的结果

使用checkstyle构建完成后,进入每一次的构建页面的左边都能看到有一个Checkstyle Warnings的图标,点击能够看到详细的信息

Java静态代码检查checkstyle - 网易杭州QA - 网易杭州 QA Team
 


 


4.3  检查规则介绍

checkstyle提供了很多的编码规则,但是有些并不适合每个团队,所以我们需要从中提炼出部分规则用于我们的项目中,这里只列举了我们使用的部分规则。

详细规则请查看官网:http://checkstyle.sf.net


<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
<module name="Checker">
<module name="TreeWalker">
<!-- Checks for Javadoc comments. -->
<!-- See http://checkstyle.sf.net/config_javadoc.html -->
<module name="JavadocType" /><!-- java的class类需要有注释说明 -->
<!-- check Method,默认的规则为^[a-z][a-zA-Z0-9]*$ 小写字母开头 -->
<module name="MethodName"/>
<!-- check local non-final variables, include parameters in catch,默认规则为^[a-z][a-zA-Z0-9]*$ -->
<module name="LocalVariableName" />
<!-- 构造类,默认的检查规则为 ^Abstract.*$|^.*Factory$ -->
<module name="AbstractClassName" />
<!-- check pakage name(only, lower case),包名必须已com.netaease开头 -->
<module name="PackageName">
<property name="format" value="^com\.netease\.[a-z]+(\.[a-z][a-z0-9]*)*$" />
</module>
<!-- check constant ,包含static和final的常量,检查规则为^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$
必须开头大写字母,其它为大写字母、下划线或者数字 -->
<module name="ConstantName" />
<!-- check non-static variables,默认^[a-z][a-zA-Z0-9]*$ -->
<module name="MemberName" />
<!-- check only for static variables, not include static final ,默认规则 ^[a-z][a-zA-Z0-9]*$ -->
<module name="StaticVariableName" />
<!-- check method parameters,默认规则默认规则 ^[a-z][a-zA-Z0-9]*$ -->
<module name="ParameterName " />
<!-- check namespace use Sun rules check local final variables, include
parameters in catch,默认规则 ^[a-z][a-zA-Z0-9]*$ -->
<module name="LocalFinalVariableName" />

<!-- Checks for Size Violations. -->
<!-- See http://checkstyle.sf.net/config_sizes.html -->
<!-- 每行代码长度为120个字符 -->
<module name="LineLength">
<property name="max" value="150"/>
</module>
<module name="MethodLength"/><!-- 默认每个方法最多150行 -->

<!-- Checks for common coding problems -->
<!-- See http://checkstyle.sf.net/config_coding.html -->
<module name="EqualsAvoidNull"/><!-- 避免存在null指针,比如 nullString.equals("My_Sweet_String"); -->
<module name="EmptyStatement"/><!-- 检查空语句,只有冒号 -->
<module name="RedundantThrows"/><!-- 检查代码中重复throw异常 -->
<module name="SimplifyBooleanReturn"/><!-- boolean类型的返回值编写复杂的可以修改为简单的 -->
<module name="StringLiteralEquality"/><!-- 字符串比较不要用==需要用equlas -->
<module name="IllegalCatch"/>catch的时候不要直接Exception全部捕获,
会导致遗漏一些内存泄露等的问题需要按具体Exception类型进行
<module name="PackageDeclaration"/><!-- 类需要有包名,否则以后其它地方引用会导入不进来 -->
<module name="JUnitTestCase"/><!-- 检查setup,teardown方法拼写、返回值等是否正确 -->
<module name="UnnecessaryParentheses"/><!-- 检查是否使用了不需要的括号 -->

</module>
</module>

5     试用总结

1、试用项目

我们在组内的DaggerEmmagee开源项目以及一些自动化测试代码项目中进行了静态代码检查的试用。

2、检查规则制定

首先基于公司Java编码规范讨论制定了一份适合组内的检查规则初稿,在初稿确定下来后在项目中进行试用,按照试用结果进行讨论修改确定最终版本,有一些检查规则当前不适合组内的所有项目,则讨论是否暂时先从检查规则中删除,比如包名必须包含com.netease,但是一些项目使用了开源的代码进行了修改,包名并不包含这些元素。

3、Eclipse中进行checkstyle检查

当检查规则确定之后,我们会在组内推广项目开发人员在Eclipse工具中配置了checkstyle插件,并且每次提交代码之前使用检查规则文件进行检查,保证没有错误后再提交,Eclipse中检查如果有错误会有提示。

 
4、Jenkins中进行checkstyle检查

在Eclipse中进行检查,有些时候开发人员可能会忘记,所以在代码提交后我们通过Jenkins中自动再检查一次,这次的检查结果会邮件通知开发人员以及项目负责人,保证有错误大家能够及时的发现,开发人员能够进行修改,我们在下图邮件中会看到当前检查总共有多少个错误以及详细的错误信息。

Java静态代码检查checkstyle - 网易杭州QA - 网易杭州 QA Team
 
通过上图邮件中的链接也可以直接进入Jenkins平台查看,Jenkins中可以看到检查结果的错误变化趋势图等更加详细的数据,见下图:
Java静态代码检查checkstyle - 网易杭州QA - 网易杭州 QA Team

 
5、常见错误汇总
通常一个之前没有进行过checkstyle检查的项目,初次检查可能会有几百个错误,不要被这个错误数吓到,修改起来还是蛮快的,
有些格式之类的错误,使用Eclipse自动格式化一下就能解决,如果命名之类的错误可以通过Eclipse统一修改。
通过checkstyle检查之后比较多的错误是如下几种
变量命名不符合规范
空格使用不规范
Java类没有加注释
 Equals使用没有避免空指针,使用了类似nullString.equals("myString");而不是使用"myString".equals(nullString)








  评论这张
 
阅读(6357)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016