測試載入器PMD使用

來源:互聯網
上載者:User
  一、基礎知識
  PMD是一種分析Java代碼錯誤的工具。與其他分析工具不同的是,PMD通過靜態分析獲知代碼錯誤。也就是說,在不運行Java程式的情況下報告錯誤。PMD附帶了許多可以直接使用的規則,利用這些規則可以找出Java來源程式的許多問題,例如沒有用到的變數、多餘的變數建立操作、空的catch塊,等等。此外,使用者還可以自己定義規則,檢查Java代碼是否符合某些特定的編碼規範。
PMD掃描java代碼並尋找潛在的如下問題: 1.可能的bug - 空try/catch/finally/switch語句 2.無效代碼 -未使用的變數,參數和私人方法 3.非最佳的代碼 - 較耗費資源的String/StringBuffer用法 4.過於複雜的運算式 - 不必要的if語句,或應該為while的for迴圈 5.重複代碼 - 複製/粘貼代碼意味著複製/粘貼bug
(2)
PMD各規則:
如:
C:\tools\pmd-4.1\bin>pmd C:\project\***\src html>a.html rulese
ts/unusedcode.xml,rulesets/basic.xml
又如:
C:\Documents and Settings\904031\案頭\findBugs+PMD\pmd-4.2.5\bin>
pmd F:\s2is\dm\dm\java xml>c:\1.xml rulesets/unusedcode.xml PMD 包含 16 個規則集,涵蓋了 Java 的各種常見問題,其中一些規則要比其他規則更有爭議:
基本(rulesets/basic.xml)—— 規則的一個基本合集,可能大多數開發人員都不認同它: catch 塊不該為空白,無論何時重寫 equals(),都要重寫 hashCode(),等等。
命名(rulesets/naming.xml)—— 對標準 Java 命令規範的測試:變數名稱不應太短;方法名稱不應過長;類名稱應當以小寫字母開頭;方法和欄位名應當以小寫字母開頭,等等。
未使用的代碼(rulesets/unusedcode.xml)—— 尋找從未使用的私人欄位和本地變數、執行不到的語句、從未調用的私人方法,等等。
設計(rulesets/design.xml)—— 檢查各種設計良好的原則,例如: switch 語句應當有 default 塊,應當避免深度嵌套的 if 塊,不應當給參數重新賦值,不應該對 double 值進行相等比較。
匯入語句(rulesets/imports.xml)—— 檢查 import 語句的問題,比如同一個類被匯入兩次或者被匯入 java.lang 的類中。
JUnit 測試(rulesets/junit.xml)—— 尋找測試案例和測試方法的特定問題,例如方法名稱的正確拼字,以及 suite() 方法是不是 static 和 public。
字串(rulesets/string.xml)—— 找出處理字串時遇到的常見問題,例如重複的字串標量,調用 String 建構函式,對 String 變數調用 toString() 方法。
括弧(rulesets/braces.xml)—— 檢查 for、 if、 while 和 else 語句是否使用了括弧。
代碼尺寸(rulesets/codesize.xml)—— 測試過長的方法、有太多方法的類以及重構方面的類似問題。
Javabean(rulesets/javabeans.xml)—— 查看 JavaBean 組件是否違反 JavaBean 編碼規範,比如沒有序列化的 bean 類。
終結函數(finalizer)—— 因為在 Java 語言中, finalize() 方法不是那麼普遍(我上次編寫這個代碼也經是好多年前的事了),所以它們的使用規則雖然很詳細,但是人們對它們相對不是很熟悉。這類檢查尋找 finalize() 方法的各種問題,例如空的終結函數,調用其他方法的 finalize() 方法,對 finalize() 的顯式調用,等等。
複製(rulesets/clone.xml)—— 用於 clone() 方法的新規則。凡是重寫 clone() 方法的類都必須實現 Cloneable, clone() 方法應該調用 super.clone(),而 clone() 方法應該聲明拋出 CloneNotSupportedException 異常,即使實際上沒有拋出異常,也要如此。
耦合(rulesets/coupling.xml)—— 尋找類之間過度耦合的跡象,比如匯入內容太多;在超類型或介面就已經夠用的時候使用子類的類型;類中的欄位、變數和傳回型別過多等。
嚴格的異常(rulesets/strictexception.xml)—— 針對異常的測試:不應該聲明該方法而拋出 java.lang.Exception 異常,不應當將異常用於流量控制,不應該捕獲 Throwable,等等。
有爭議的(rulesets/controversial.xml)—— PMD 的有些規則是有能力的 Java 程式員可以接受的。但還是有一些爭議。這個規則集包含一些更有問題的檢驗,其中包括把 null 賦值給變數、方法中有多個返回點,以及從 sun 包匯入等。
日誌(rulesets/logging-java.xml)—— 尋找 java.util.logging.Logger 的不當使用,包括非終狀態(nonfinal)、非靜態記錄器,以及在一個類中有多個記錄器。
(3)
PMD各種顯示器:
PMD comes with 4 differents type of renderers: 1.text, which does a basic text ouput of pmd's report;
2.xml, which format as XML the report;
3.html, which format the result as a very basic HTML page;
4.nicehtml, which is "better" html view of the result. As this feature use an XSLT transformation, it also possible to override the default stylesheet using the -xslt parameter.
如:
java net.sourceforge.pmd.PMD /path/to/source nicehtml basic,imports,unusedcode -xslt my-own-stylesheet.xsl (3)
錯誤層級:
PMD priority 1 -> severity error, priority high
PMD priority 2 -> severity error, priority normal
PMD priority 3 -> severity warning, priority high
PMD priority 4 -> severity warning, priority normal
PMD priority 5 -> severity information, priority normal
即:
PMD的優先順序1 - “嚴重的錯誤,優先高
PMD的優先順序2 - “嚴重的錯誤,優先正常
PMD的優先3 - “嚴重警告,優先高
PMD的優先4 - “嚴重警告,優先正常
PMD的優先5 - “嚴重的資訊,優先正常 即使是PMD priority 1,不意味著代碼出錯,而是代碼不規範。如:
static final的變數非全部大寫。
static final sysLoger --- static final SYSLOGER ----------------------------------------
pmd檢測代碼且產生html檢測報告 1.下載PMD壓縮包 最新pmd4.2.5.zip 2.解壓 3.建立如下指令檔(checkAll.bat),放置在解壓後的bin目錄下: @echo off rem author:hwj 2010-01-27 rem 要檢查的檔案和路徑
set filepath=C:\12 rem 報告輸出的路徑
set reportpath=c:\code-check-report\ rem 擷取當前年月日和時分秒
set nowTime=%DATE:~0,10%" "%TIME:~1,7% rem 替換:為-
set nowTime=%nowtime::=-% rem 合成報告檔案路徑名
set outfile=%reportpath%%nowtime%.html rem 指定輸出rendener
rem set xslt="../etc/xslt/corley-pmd-report.xslt"
rem set xslt="../etc/xslt/only-prio1.xslt"
rem set xslt="../etc/xslt/pmd-report.xslt"
rem set xslt="../etc/xslt/only-prio1.xslt"
set xslt="../etc/xslt/wz-pmd-report.xslt"
rem 指定檢查規則,這裡包括了官方推出的java的所有規則
set ruleset="rulesets/internal/all-java.xml" rem 執行檢查並輸出報告
pmd %filepath% nicehtml %ruleset% -xslt %xslt% -reportfile %outfile%
以上指令碼要設定的只有 filepath,reportPath. 產生html,如下: ----------------------------------------
把pmd整合到ant中。 1.(可選)將pmd的lib下的jar檔案都copy到項目的build目錄下的pmd目錄中。此處直接設定為pmd的lib目錄 2.開啟build.xml,添加如下部分:--此處,直接建立一個檔案checkAll.xml
<project name="pmd" default="pmd" basedir="../">
<path id="pmd.classpath">
<pathelement location="${basedir}/"/>
<fileset dir="lib/">
<include name="*.jar"/>
</fileset>
</path> <target name="pmd">
<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath"/> <pmd shortFilenames="true">
<ruleset>unusedcode</ruleset>
<ruleset>basic</ruleset>
<ruleset>imports</ruleset> <formatter type="html" toFile="pmd_report.html" toConsole="true"/> <fileset dir="C:\12">
<include name="**/*.java"/>
</fileset>
</pmd>
</target>
</project> 其中path部分是定義pmd所需要的jar的目錄為pmd.classpath,${basedir}就是項目所在目錄, target部分就是執行pmd的部分,taskdef定義了執行該任務的類是net.sourceforge.pmd.ant.PMDTask,其類路徑為pmd.classpath。pmd 部分是pmd的執行設定,<ruleset>指定其檢查規則,formatter是結果輸出檔案。fileset是被pmd檢查的檔案目標路徑。 儲存checkAll.xml之後,可以用ant -buidlfile checkAll.xml 來執行檢查. ----------------------------------------
把pmd整合到eclipse中。
只須將此包解壓:pmd-eclipse-1.8.0.zip-->放於eclipse中的plugins中,重啟eclipse-->右鍵選擇項目-->PMD-->選擇第一個選項toggle PMD nature-->在eclipse中的question中會產生PMD的檢查結果-->若要消失,則再選擇項目-->PMD-->選擇第一個選項toggle PMD nature即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.