白盒靜態自動化測試工具:PMD使用指南


參考文獻:
http://www.oschina.net/p/pmd/
http://www.cnblogs.com/flyme/archive/2011/09/09/2172548.html
http://blog.csdn.net/ml5271169588/article/details/6975690
 
目 錄     
1     PMD介紹     
2     在ECLIPSE中安裝和使用PMD步驟     
2.1     Elipse中安裝PMD插件     
3     在ECLIPSE中使用PMD操作步驟     
3.1     激活PMD插件     
3.2     打開PMD視圖     
3.3     執行PMD任務     
3.4     Violations Overview淺析     
3.5     Violations Outline淺析     
4     關於PMD規則     
4.1     選擇合適的規則     
4.2     自帶規則的介紹     
4.3     自定義規則     
4.4     自定義規則集合     
4.5     其它事項     
5     使用ANT進行調用     
6     總結     


1     PMD介紹
     PMD是一款采用BSD協議發布的Java程序代碼檢查工具。該工具可以做到檢查Java代碼中是否含有未使用的變量、是否含有空的抓取塊、是否含有不必要的對象等。該軟件功能強大,掃描效率高,是Java程序員debug的好幫手。
     與其他分析工具不同的是,PMD通過靜態分析獲知代碼錯誤。也就是說在不運行Java程序的情況下,報告錯誤。
     PMD附帶了許多可以直接使用的規則,利用這些規則可以找出Java源程序的許多問題。
     此外,用戶還可以自己定義規則。檢查Java代碼是否符合某些特定的編碼規范。常見的類型如下:

  • 可能的bug(Possible bugs):空try/catch/finally/switch語句
  • 無效代碼(Dead code):未使用的變量,參數和私有方法
  • 非最佳的代碼(Suboptimal code):較耗費資源的String/StringBuffer用法
  • 過於復雜的表達式(Overcomplicated expressions):不必要的if語句,或應該為while的for循環
  • 重復代碼(Duplicate code):復制/粘貼代碼意味着復制/粘貼bug

2     在Eclipse中安裝和使用PMD步驟
2.1     Elipse中安裝PMD插件
     以下為我的安裝步驟,可能大家用的是MyEclipse步驟不僅相同。
     打開Help->Install new Software,點擊Add,添加Repository。Name:PMD,Location:http://pmd.sf.net/eclipse。點擊OK。選擇相應的版本插件,繼續隨后的安裝。
Step 1:


Step 2:

Step 3:


3     在Eclipse中使用PMD操作步驟

3.1     激活PMD插件
     Ecplise的菜單Project->Properties->PMD,在這個窗口選擇要應用的規則,並指定相對重要性,為特定項目詳細配置PMD,目前只需要選中Enable PMD復選框,保留默認規則集。

3.2     打開PMD視圖
 

3.3     執行PMD任務
     單擊項目資源,右鍵->PMD->Check code with PMD。在Violation OverView視圖中按問題嚴重程度列出PMD問題。
 

     在ViolationsoutLinew右鍵show Details可以查看更詳細的規則描述以及說明規則的示例代碼。
 

3.4     Violations Overview淺析
     一旦理解了PMD提出的問題,可以決定如何處理問題。

  • Element:檢查的文件;
  • Violation/LOC(lineofcode縮寫)為:警告個數/源代碼行數x1000;
  • Violations/Method:警告個數除以方法個數(類中每個方法中的平均錯誤);
  • Project:所在項目

     右鍵點擊框體的任意位置顯示4個選項按鈕對應的功能為 
  • Filter Resource:是否展示下列工程
  • Filter Priorities:想要展示的警告等級(5個等級,紅色為最嚴重的警告)
  • Presentation Type:展示的結構
  • clear PMD violations:清除Violations Outline內的信息
3.5     Violations Outline淺析
     具體處理問題,還是利用Violations Outline比較方便。
     右鍵點擊彈出tips如下:

      查看詳細(Show Details):顯示錯誤的詳細信息 顯示錯誤的詳細信息,如右圖所示:
      忽略問題(Mark as reviewed):可能決定可以安全的忽略問題,在這種情況下,使用Mark as reviewed(標記為已審查)菜單項,這將向代碼添加一個注釋,以指示PMD在這里忽略此問題。
      手工糾正(Remove violation):可以手工糾正問題,並使用Remove violation(刪除違例)菜單直接從列表中刪除問題。
      智能修改:PMD非常智能,在某些情況下,它可以為其提出的問題提供糾正建議,如果是這種情況,可以使用Quick fix(快速修復)菜單類自動糾正。

     展開列表,雙擊列表中具體的問題就可以定位的具體的代碼行。


4     關於PMD規則
4.1     選擇合適的規則
     運行所有的規則集中的規則會產生非常多的沖突,這些沖突中的很多是不重要的。在這么多的沖突中尋找你關心的部分結果就沒有什么效率可言了。
     所以需要從明顯的規則集,也就是說必須要改的地方開始是比較好的一個選擇,例如只是運行unusedcode檢查,然后修改沒有使用的局部變量和成員變量。然后運行基本的檢查,修改所有的空語句,例如if語句等。最后可以執行與設計相關的或者存在一定爭議的規則集,或者自定義的規則集。

4.2     自帶規則的介紹
     PMD自帶規則極多,我頓時石化了。還好網上有相應的資料下載。
     (PMD插件分析代碼規則(中文).xls) http://download.csdn.net/detail/xiaonn2007/504948
4.3     自定義規則
     有兩個辦法來自定義規則,可以編寫java類和編寫XPath。
     編寫java類的一般步驟是:
  • 先確定要查找的代碼形式,利用PMD 自帶的designer.bat工具查看AST(抽象語法樹);
  • 然后編寫規則類(繼承 net.sourceforge.pmd.AbstractRule);
  • 然后編寫一個ruleset的XML文件;
  • 最后就可以運行PMD進行檢查。
     編寫 XPath比編寫java類要容易些,但也需要掌握AST的含義,利用designer.bat工具可以查看AST,比如下面這個 ruleset 的 XML 文件的例子:
  • //ClassBody [count(//VariableDeclarator[../Type/Name[@Image='Logger']])>1] ,這個表達式就是查找類的代碼里是否聲明了多個 Logger ;
  • 然后編寫一個 ruleset 的 XML 文件;
  • 最后運行 PMD 進行檢查。
4.4     自定義規則集合
     PMD 自帶了很多代碼規范的規則,還可以自定義規則,我們可以把這些規則整合到一起,按照我們的需求進行代碼檢查。
   
   
   
           
<!--  使用整個strings規則集  -->
   < rule  ref ="rulesets/strings.xml" />
<!--  使用某個規則集里的某個規則  -->
   < rule  ref ="rulesets/unusedcode.xml/UnusedLocalVariable" />
<!--  指定某個規則集里的某個規則的優先級  -->
< rule  ref ="rulesets/basic.xml/EmptyCatchBlock"  message ="Must handle exceptions" >
     < priority >2 </ priority >
</ rule >
           <!--  去除某個規則集里的某個規則  -->
< rule  ref ="rulesets/braces.xml" >
     < exclude  name ="WhileLoopsMustUseBracesRule" />
</ rule >
     最后,我們運行PMD的時候就可以指定這個 ruleset 文件。
     PMD 里面還有一個寫好的ruleset文件,在pmd-3.8.jar里面的rulesets文件夾下,名稱是favorites.xml,以下是主要部分:
   
   
   
           
<  rule   ref  ="rulesets/basic.xml"   />
<  rule   ref  ="rulesets/basic.xml/EmptyCatchBlock"   message  ="Must handle exceptions"   >
          <  priority  > 2  </  priority  >
</  rule  >
      <  rule   ref  ="rulesets/unusedcode.xml"   />
<  rule   ref  ="rulesets/braces.xml/WhileLoopsMustUseBraces"   />
<  rule   ref  ="rulesets/braces.xml/ForLoopsMustUseBraces"   />
<  rule   ref  ="rulesets/design.xml/SimplifyBooleanReturns"   />
<  rule   ref  ="rulesets/design.xml/SwitchStmtsShouldHaveDefault"   />
<  rule   ref  ="rulesets/strings.xml/StringToString"   />
<  rule   ref  ="rulesets/strings.xml/StringInstantiation"   />
<  rule   ref  ="rulesets/controversial.xml/UnnecessaryConstructor"   />
<  rule   ref  ="rulesets/controversial.xml/NullAssignment"   />
<  rule   ref  ="rulesets/controversial.xml/UnusedModifier"   />
<  rule   ref  ="rulesets/codesize.xml/CyclomaticComplexity"   >
      <  properties  ><  property   name  ="reportLevel"   value  ="5"   /></  properties  >
</  rule  >

4.5     其它事項:
  • 可以使用JDK1.5的聲明 @SuppressWarnings(""),禁止PMD的警告。
  • 可以使用//NOPMD來標記行或塊代碼,禁止PMD警告。
  • 有兩種方法自定義Rule,編寫java類和編寫XPath。


5     使用Ant進行調用
     有了 Ant 這樣的自動化機制,就可以以多種方法監視軟件質量。有許多種掃描源代碼和二進制文件的工具,但是其中最流行的兩種是PMD和FindBugs。
     FindBugs掃描二進制文件,並根據一系列規則檢查其中的代碼。如果編譯好的代碼有問題,它就會報告一個違規。
     PMD的作用與FindBugs相似,是它掃描源文件並報告 bug。
     以下為配置腳本:
   
   
   
           
< path  id ="pmd.path" >
     < fileset  dir ="${lib.dir}/pmd-3.8" >
         < include  name ="**/*.jar"   />
     </ fileset >
</ path >
< taskdef  name ="pmd"  classname ="net.sourceforge.pmd.ant.PMDTask"  classpathref ="pmd.path" />
< taskdef  name ="cpd"  classname ="net.sourceforge.pmd.cpd.CPDTask"  classpathref ="pmd.path" />
     < target  name ="pmd" >
         < pmd  shortFilenames ="true" >
             < ruleset >rulesets/favorites.xml </ ruleset >           
             < formatter  type ="html"  toFile ="d:\foo.html"  toConsole ="false" />
             < fileset  dir ="${src.dir}" >
                 < include  name ="**/*.java" />
             </ fileset >
         </ pmd >
     </ target >
< target  name ="cpd" >
         < cpd  minimumTokenCount ="100"  outputFile ="d:/cpd.txt" >
             < fileset  dir ="${src.dir}" >
                 < include  name ="**/*.java" />
             </ fileset >
         </ cpd >
</ target >


6     總結
     更多詳情,請查閱官方手冊:
      http://www.ibm.com/developerworks/cn/java/j-pmd/
      http://pmd.sourceforge.net/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM