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

时间:2021-05-26 07:14:52

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