白盒静态自动化测试工具:PMD使用指南

时间:2021-12-07 11:32:51

参考文献:
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:

白盒静态自动化测试工具:PMD使用指南

Step 2:
白盒静态自动化测试工具:PMD使用指南

Step 3:
白盒静态自动化测试工具:PMD使用指南


3     在Eclipse中使用PMD操作步骤

3.1     激活PMD插件
     Ecplise的菜单Project->Properties->PMD,在这个窗口选择要应用的规则,并指定相对重要性,为特定项目详细配置PMD,目前只需要选中Enable PMD复选框,保留默认规则集。
白盒静态自动化测试工具:PMD使用指南

3.2     打开PMD视图
白盒静态自动化测试工具:PMD使用指南
 
白盒静态自动化测试工具:PMD使用指南

3.3     执行PMD任务
     单击项目资源,右键->PMD->Check code with PMD。在Violation OverView视图中按问题严重程度列出PMD问题。
白盒静态自动化测试工具:PMD使用指南
 
白盒静态自动化测试工具:PMD使用指南

     在ViolationsoutLinew右键show Details可以查看更详细的规则描述以及说明规则的示例代码。
白盒静态自动化测试工具:PMD使用指南
 
白盒静态自动化测试工具:PMD使用指南

3.4     Violations Overview浅析
     一旦理解了PMD提出的问题,可以决定如何处理问题。
白盒静态自动化测试工具:PMD使用指南

  • Element:检查的文件;
  • Violation/LOC(lineofcode缩写)为:警告个数/源代码行数x1000;
  • Violations/Method:警告个数除以方法个数(类中每个方法中的平均错误);
  • Project:所在项目

     右键点击框体的任意位置显示4个选项按钮对应的功能为 
白盒静态自动化测试工具:PMD使用指南
  • Filter Resource:是否展示下列工程
  • Filter Priorities:想要展示的警告等级(5个等级,红色为最严重的警告)
  • Presentation Type:展示的结构
  • clear PMD violations:清除Violations Outline内的信息
3.5     Violations Outline浅析
     具体处理问题,还是利用Violations Outline比较方便。
白盒静态自动化测试工具:PMD使用指南
     右键点击弹出tips如下:
白盒静态自动化测试工具:PMD使用指南

      查看详细(Show Details):显示错误的详细信息 显示错误的详细信息,如右图所示:
白盒静态自动化测试工具:PMD使用指南
      忽略问题(Mark as reviewed):可能决定可以安全的忽略问题,在这种情况下,使用Mark as reviewed(标记为已审查)菜单项,这将向代码添加一个注释,以指示PMD在这里忽略此问题。
      手工纠正(Remove violation):可以手工纠正问题,并使用Remove violation(删除违例)菜单直接从列表中删除问题。
      智能修改:PMD非常智能,在某些情况下,它可以为其提出的问题提供纠正建议,如果是这种情况,可以使用Quick fix(快速修复)菜单类自动纠正。

     展开列表,双击列表中具体的问题就可以定位的具体的代码行。
白盒静态自动化测试工具:PMD使用指南


4     关于PMD规则
4.1     选择合适的规则
     运行所有的规则集中的规则会产生非常多的冲突,这些冲突中的很多是不重要的。在这么多的冲突中寻找你关心的部分结果就没有什么效率可言了。
     所以需要从明显的规则集,也就是说必须要改的地方开始是比较好的一个选择,例如只是运行unusedcode检查,然后修改没有使用的局部变量和成员变量。然后运行基本的检查,修改所有的空语句,例如if语句等。最后可以执行与设计相关的或者存在一定争议的规则集,或者自定义的规则集。

4.2     自带规则的介绍
     PMD自带规则极多,我顿时石化了。还好网上有相应的资料下载。
     (PMD插件分析代码规则(中文).xls) http://download.csdn.net/detail/xiaonn2007/504948
白盒静态自动化测试工具:PMD使用指南
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/