CheckStyle是什么:CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要但枯燥的任务中解脱出来。
本文从测试人员角度,对N个项目的进行了代码规范的检查,汇总问题,并对各个规则设置处理方式,以及Eclipse中格式设置自动修复
1.
配置自己的checkstyle.xml
可以参考官方提供了sun、google的检查规则,两者检查都比较细,定义自己的检查规则,可以先把所有规则罗列出来,初步分出 必须检查、可忽略、不确认 三个分类,然后和BOSS有个沟通,将检查规则明确下来。
当前官网提供154种规则,自己定义的规则只检查83种。
ArrayTypeStyle检查数组类型定义的样式。
AvoidNestedBlocks检查不需要的嵌套’{}’
EmptyBlock检查空的代码块。
LeftCurly检查’{’和代码是否同行
NeedBraces检查是否需要大括号。主要是在if,else时的情况。
RightCurly检查’}’和代码是否同行
ArrayTrailingComma检查数组初始化是否以逗号结束
AvoidInlineConditionals检查inline的条件操作。(避免内联条件语句)
DeclarationOrder检查类和接口中的声明顺序。
DefaultComesLast检查default的clause是否在switch代码段的最后。
EmptyStatement检查空的代码段。
EqualsAvoidNull检查空字符串进行equals()比较
ExplicitInitialization检查类和对象成员是否初始化为默认值。
FinalLocalVariable检查未改变过的局部变量是否声明为final。
FallThrough检查switch代码的case中是否缺少break,return,throw和continue。
IllegalCatch检查是否catch了不能接受的错误。
IllegalThrows检查是否抛出了未声明的异常。
IllegalType检查未使用过的类。
MagicNumber检查是否有“magicnumbers”硬写到代码里的整数常量
InnerAssignment检查是否存在内部赋值(不允许)(已查)
MissingSwitchDefault检查switch语句是否有default的clause。
ModifiedControlVariable检查循环控制的变量是否在代码块中被修改。
MultipleStringLiterals检查一个字符串变量在不改变变量值的情况下或者字符串出现的次数
MultipleVariableDeclarations检查一次声明多个变量时,变量是否在同一行或者在同一个语句中
NestedIfDepth检查嵌套的层次深度。最多5层
NestedForDepth检查嵌套的层次深度。最多3层
NestedTryDepth检查try-catch异常处理,最多3层
PackageDeclaration检查类中是否有声明package。
ParameterAssignment检查是否存在不允许的参数赋值。
RequireThis检查代码中是否有“this.”。
ReturnCount限制return个数。默认为3(限制逻辑)
SimplifyBooleanExpression检查是否有过度复杂的布尔表达式。
SimplifyBooleanReturn检查是否有过于复杂的布尔返回代码段。
StringLiteralEquality检查字符串是否有用==或!=进行操作。
UnnecessaryParentheses检查是否使用了多余的小括号
MutableException确保异常是不可变的
ThrowsCount限制抛出异常的数量。(默认设置为3)
VisibilityModifier检查类成员的可见度。(类的属性为私有,静态才能有public,属性需带有修饰符)
FinalParameters检查方法名、构造函数、catch块的参数是否是final的。(资源是否要释放)
AvoidStarImport检查是否有使用*进行import。
ImportOrder检查import的分组和顺序。
RedundantImport检查是否有重复的import
UnusedImports检查是否有未使用的import。
Indentation检查代码中正确的缩进
JavadocMethod检查方法是否有注释,可以不声明RuntimeException
JavadocStyle检查javadoc的格式。
JavadocType检查类是否缺少注释(允许未知标签)
JavadocVariable检查变量是否缺少注释(只检查常量)
ModifierOrder检查修饰符的顺序是否遵照java语言规范。
RedundantModifier检查接口和annotation中是否有重复的修饰符
AbstractClassName检查抽象类的命名
ConstantName检查常量名。
LocalFinalVariableName检查局部的final类型的变量命名
LocalVariableName检查局部的非final类型的变量名
MemberName检查非静态变量。
MethodName检查方法的命名
PackageName检查包的命名。
ParameterName检查方法的参数的命名
StaticVariableName检查静态的,非final类型的变量名。
TypeName检查类和接口的命名
NewlineAtEndOfFile检查文件是否以一个空行结束。
Regexp检查程序是否有System.out.println(排除已注释)
AnonInnerLength检查匿名内部类的长度。默认为150。
FileLength检查java文件的长度。默认为1500。
LineLength检查代码行的长度。默认为80。
MethodLength检查方法和构造函数的长度。默认为60。
ParameterNumber检查方法和构造函数的参数个数。默认为5。
TodoCommentTODO检查,是否出现未办事项
TrailingComment确保代码没有尾行注释
Translation检查property文件中是否有相同的key。
UncommentedMain检查是否有未注释的main方法。
UpperEll检查long型约束是否有大写的“L”。
EmptyForInitializerPad检查是否有未初始化的循环变量
EmptyForIteratorPad检查是否有空的迭代
FileTabCharacter检查是否有Tab字符
MethodParamPad允许方法名后紧跟左边圆括号"("
NoWhitespaceAfter检查分隔符后的空白。
NoWhitespaceBefore检查分隔符前的空白。
OperatorWrap检查操作符的空白规则
ParenPad检查圆括号的空白规则
TypecastParenPad检查强制转型的圆括号的空白规则(String)object)
WhitespaceAfter检查分隔符后是否有空白
WhitespaceAround检查分隔符周围是否有空白
2.
使用ant 调用checkstyle 获取结果文件
ant 对应的文件检查文件: check.xml
执行ant后 获取的检查结果: checkstyle_sccms.xml
3.
解析checkStyle的结果文件(XML),并存入数据库
解析代码在 CheckStyleErrorParse.java
4.
数据库数据分析
1) 查每个种类有多少个Error:
SELECT source,COUNT(source) as total,message FROM checkstyle_error_scepg GROUP BY source order by source asc;
2) 查每个文件有多少个Error
SELECT file_name,COUNT(file_name) as total FROM checkstyle_error_scepg GROUP BY file_name order by total desc;
5.
统计汇总
目的:对当前所有已检查的项目 能一目了然地看到有多少个错误,平均每个文件的错误数,每个检查项具体有多少问题等
6.
问题的处理方式
对检查出的问题定义了四种处理方式:
1)代码重构 (检查项NestedIfDepth、NestedForDepth、NestedTryDepth、ReturnCount、ThrowsCount、FileLength、MethodLength、ParameterNumber)
2)研发处理 (Naming Conventions、Javadoc、Design、部分Coding)
3)格式设置 (4个空白格替代Tab键值、分隔符、操作符前后空格设置,Imports 、RequireThis等从格式规避)
4)非强制性 (只检查,可不做修改)
7.
Eclipse格式设置
Code Style 的Clean Up、Code Templates、Formatter ,三者都是围绕checkstyle定义的检查规则,从格式上对需进行规避。
Clean up 配置如下,文件在cleanup.xml,Clean Up 可以帮忙找出不符合要求的,并自动删除/补全。
Formatter 主要对coding 的显示样式进行规范化(操作符/分隔符/括号等前后空格、换行、是否同行等),设置好了之后,今后在项目上点击右键-source-Format,就可以自动调整文件的格式啦,非常方便,可设置有Indentation、Braces、White Space 、Blank Lines、New Lines、Control Statements、Line Wrapping、Comments
Code Templates 主要对Coding 整体设置 注释模板、编码模板
1)注释模板:如对文件、类、方法、参数设置统一注释
2)编码模板:对文件、类、方法 须有哪些内容做统一
具体配置模板在 codeTemplates.xml
8.
验证效果
第一步:在项目上右键-source-Format
第二步:在项目上右键-source-Clean up
这一步会检查出很多不符合规范的,点击下一步,进行清理 自动删除/补全 即可
第三步:执行ant的check.xml
第四步:查看新的检查结果
以sccms为例