CheckStyle是什么:CheckStyle是SourceForge下的一個項(xiàng)目,提供了一個幫助JAVA開發(fā)人員遵守某些編碼規(guī)范的工具惨险。它能夠自動化代碼規(guī)范檢查過程羹幸,從而使得開發(fā)人員從這項(xiàng)重要但枯燥的任務(wù)中解脫出來。
本文從測試人員角度辫愉,對N個項(xiàng)目的進(jìn)行了代碼規(guī)范的檢查栅受,匯總問題,并對各個規(guī)則設(shè)置處理方式,以及Eclipse中格式設(shè)置自動修復(fù)
1.
配置自己的checkstyle.xml
可以參考官方提供了sun屏镊、google的檢查規(guī)則依疼,兩者檢查都比較細(xì),定義自己的檢查規(guī)則而芥,可以先把所有規(guī)則羅列出來律罢,初步分出 必須檢查、可忽略棍丐、不確認(rèn) 三個分類误辑,然后和BOSS有個溝通,將檢查規(guī)則明確下來歌逢。
當(dāng)前官網(wǎng)提供154種規(guī)則巾钉,自己定義的規(guī)則只檢查83種。
ArrayTypeStyle檢查數(shù)組類型定義的樣式秘案。
AvoidNestedBlocks檢查不需要的嵌套’{}’
EmptyBlock檢查空的代碼塊砰苍。
LeftCurly檢查’{’和代碼是否同行
NeedBraces檢查是否需要大括號。主要是在if踏烙,else時的情況拌夏。
RightCurly檢查’}’和代碼是否同行
ArrayTrailingComma檢查數(shù)組初始化是否以逗號結(jié)束
AvoidInlineConditionals檢查inline的條件操作著洼。(避免內(nèi)聯(lián)條件語句)
DeclarationOrder檢查類和接口中的聲明順序。
DefaultComesLast檢查default的clause是否在switch代碼段的最后。
EmptyStatement檢查空的代碼段毡惜。
EqualsAvoidNull檢查空字符串進(jìn)行equals()比較
ExplicitInitialization檢查類和對象成員是否初始化為默認(rèn)值。
FinalLocalVariable檢查未改變過的局部變量是否聲明為final潘明。
FallThrough檢查switch代碼的case中是否缺少break蛋欣,return,throw和continue处面。
IllegalCatch檢查是否catch了不能接受的錯誤厂置。
IllegalThrows檢查是否拋出了未聲明的異常。
IllegalType檢查未使用過的類魂角。
MagicNumber檢查是否有“magicnumbers”硬寫到代碼里的整數(shù)常量
InnerAssignment檢查是否存在內(nèi)部賦值(不允許)(已查)
MissingSwitchDefault檢查switch語句是否有default的clause昵济。
ModifiedControlVariable檢查循環(huán)控制的變量是否在代碼塊中被修改。
MultipleStringLiterals檢查一個字符串變量在不改變變量值的情況下或者字符串出現(xiàn)的次數(shù)
MultipleVariableDeclarations檢查一次聲明多個變量時野揪,變量是否在同一行或者在同一個語句中
NestedIfDepth檢查嵌套的層次深度访忿。最多5層
NestedForDepth檢查嵌套的層次深度。最多3層
NestedTryDepth檢查try-catch異常處理斯稳,最多3層
PackageDeclaration檢查類中是否有聲明package海铆。
ParameterAssignment檢查是否存在不允許的參數(shù)賦值。
RequireThis檢查代碼中是否有“this.”挣惰。
ReturnCount限制return個數(shù)卧斟。默認(rèn)為3(限制邏輯)
SimplifyBooleanExpression檢查是否有過度復(fù)雜的布爾表達(dá)式殴边。
SimplifyBooleanReturn檢查是否有過于復(fù)雜的布爾返回代碼段。
StringLiteralEquality檢查字符串是否有用==或!=進(jìn)行操作珍语。
UnnecessaryParentheses檢查是否使用了多余的小括號
MutableException確保異常是不可變的
ThrowsCount限制拋出異常的數(shù)量锤岸。(默認(rèn)設(shè)置為3)
VisibilityModifier檢查類成員的可見度。(類的屬性為私有廊酣,靜態(tài)才能有public能耻,屬性需帶有修飾符)
FinalParameters檢查方法名、構(gòu)造函數(shù)亡驰、catch塊的參數(shù)是否是final的晓猛。(資源是否要釋放)
AvoidStarImport檢查是否有使用*進(jìn)行import。
ImportOrder檢查import的分組和順序凡辱。
RedundantImport檢查是否有重復(fù)的import
UnusedImports檢查是否有未使用的import戒职。
Indentation檢查代碼中正確的縮進(jìn)
JavadocMethod檢查方法是否有注釋,可以不聲明RuntimeException
JavadocStyle檢查javadoc的格式透乾。
JavadocType檢查類是否缺少注釋(允許未知標(biāo)簽)
JavadocVariable檢查變量是否缺少注釋(只檢查常量)
ModifierOrder檢查修飾符的順序是否遵照java語言規(guī)范洪燥。
RedundantModifier檢查接口和annotation中是否有重復(fù)的修飾符
AbstractClassName檢查抽象類的命名
ConstantName檢查常量名。
LocalFinalVariableName檢查局部的final類型的變量命名
LocalVariableName檢查局部的非final類型的變量名
MemberName檢查非靜態(tài)變量乳乌。
MethodName檢查方法的命名
PackageName檢查包的命名捧韵。
ParameterName檢查方法的參數(shù)的命名
StaticVariableName檢查靜態(tài)的,非final類型的變量名汉操。
TypeName檢查類和接口的命名
NewlineAtEndOfFile檢查文件是否以一個空行結(jié)束再来。
Regexp檢查程序是否有System.out.println(排除已注釋)
AnonInnerLength檢查匿名內(nèi)部類的長度。默認(rèn)為150磷瘤。
FileLength檢查java文件的長度芒篷。默認(rèn)為1500。
LineLength檢查代碼行的長度采缚。默認(rèn)為80针炉。
MethodLength檢查方法和構(gòu)造函數(shù)的長度。默認(rèn)為60扳抽。
ParameterNumber檢查方法和構(gòu)造函數(shù)的參數(shù)個數(shù)篡帕。默認(rèn)為5。
TodoCommentTODO檢查贸呢,是否出現(xiàn)未辦事項(xiàng)
TrailingComment確保代碼沒有尾行注釋
Translation檢查property文件中是否有相同的key赂苗。
UncommentedMain檢查是否有未注釋的main方法。
UpperEll檢查long型約束是否有大寫的“L”贮尉。
EmptyForInitializerPad檢查是否有未初始化的循環(huán)變量
EmptyForIteratorPad檢查是否有空的迭代
FileTabCharacter檢查是否有Tab字符
MethodParamPad允許方法名后緊跟左邊圓括號"("
NoWhitespaceAfter檢查分隔符后的空白。
NoWhitespaceBefore檢查分隔符前的空白朴沿。
OperatorWrap檢查操作符的空白規(guī)則
ParenPad檢查圓括號的空白規(guī)則
TypecastParenPad檢查強(qiáng)制轉(zhuǎn)型的圓括號的空白規(guī)則(String)object)
WhitespaceAfter檢查分隔符后是否有空白
WhitespaceAround檢查分隔符周圍是否有空白
2.
使用ant 調(diào)用checkstyle 獲取結(jié)果文件
ant 對應(yīng)的文件檢查文件:?check.xml?
執(zhí)行ant后 獲取的檢查結(jié)果:?checkstyle_sccms.xml
3.
解析checkStyle的結(jié)果文件(XML)猜谚,并存入數(shù)據(jù)庫
解析代碼在 ?CheckStyleErrorParse.java
4.
數(shù)據(jù)庫數(shù)據(jù)分析
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.
統(tǒng)計(jì)匯總?
目的:對當(dāng)前所有已檢查的項(xiàng)目 能一目了然地看到有多少個錯誤败砂,平均每個文件的錯誤數(shù),每個檢查項(xiàng)具體有多少問題等
6.
問題的處理方式
對檢查出的問題定義了四種處理方式:
1)代碼重構(gòu) (檢查項(xiàng)NestedIfDepth魏铅、NestedForDepth昌犹、NestedTryDepth、ReturnCount览芳、ThrowsCount斜姥、FileLength、MethodLength沧竟、ParameterNumber)
2)研發(fā)處理 (Naming Conventions铸敏、Javadoc、Design悟泵、部分Coding)
3)格式設(shè)置 (4個空白格替代Tab鍵值杈笔、分隔符、操作符前后空格設(shè)置糕非,Imports 蒙具、RequireThis等從格式規(guī)避)
4)非強(qiáng)制性 (只檢查,可不做修改)
7.
Eclipse格式設(shè)置
Code Style 的Clean Up朽肥、Code Templates禁筏、Formatter ,三者都是圍繞checkstyle定義的檢查規(guī)則衡招,從格式上對需進(jìn)行規(guī)避篱昔。
Clean up 配置如下,文件在cleanup.xml蚁吝,Clean Up 可以幫忙找出不符合要求的旱爆,并自動刪除/補(bǔ)全。
Formatter 主要對coding 的顯示樣式進(jìn)行規(guī)范化(操作符/分隔符/括號等前后空格窘茁、換行怀伦、是否同行等),設(shè)置好了之后山林,今后在項(xiàng)目上點(diǎn)擊右鍵-source-Format房待,就可以自動調(diào)整文件的格式啦,非常方便驼抹,可設(shè)置有Indentation桑孩、Braces、White Space 框冀、Blank Lines流椒、New Lines、Control Statements明也、Line Wrapping宣虾、Comments
Code Templates 主要對Coding 整體設(shè)置 注釋模板惯裕、編碼模板
1)注釋模板:如對文件、類绣硝、方法蜻势、參數(shù)設(shè)置統(tǒng)一注釋
2)編碼模板:對文件、類鹉胖、方法 須有哪些內(nèi)容做統(tǒng)一
具體配置模板在 codeTemplates.xml
8.
驗(yàn)證效果
第一步:在項(xiàng)目上右鍵-source-Format
第二步:在項(xiàng)目上右鍵-source-Clean up
這一步會檢查出很多不符合規(guī)范的握玛,點(diǎn)擊下一步,進(jìn)行清理 自動刪除/補(bǔ)全 即可
第三步:執(zhí)行ant的check.xml
第四步:查看新的檢查結(jié)果
以sccms為例