• 白盒静态自动化测试工具: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/
  • 相关阅读:
    java集合:ArrayList(1)
    java虚拟机:堆内存
    计算机三种编码与加减运算
    java虚拟机:程序计数器
    java虚拟机:JIT编译器
    java虚拟机:运行时常量池
    java虚拟机:方法区
    java虚拟机:本地方法栈
    java虚拟机:class文件结构
    linux安装mysql
  • 原文地址:https://www.cnblogs.com/snifferhu/p/3463597.html
Copyright © 2020-2023  润新知