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

白盒静态自动化测试工具:PMD使用指南的更多相关文章

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

    目 录     1     FINDBUGS介绍     2     在ECLIPSE中安装FINDBUGS插件     3     在ECLIPSE中使用FINDBUGS操作步骤     3.1   ...

  2. JAVA语言搭建白盒静态代码、黑盒网站插件式自动化安全审计平台

    近期打算做一个插件化的白盒静态代码安全审计自动化平台和黑盒网站安全审计自动化平台.现在开源或半开源做黑盒网站安全扫描的平台,大多是基于python脚本,安全人员贡献python脚本插件增强平台功能.对 ...

  3. 移动測试技术保护源码!解码全球首款移动端白盒測试工具ThreadingTest (文章转自己主动点科技)

    作者 智晓锋 - 2014/07/14 自从斯诺登曝光美监听丑闻事件之后,我国政府就将信息安全问题上升到了国家安全的高度.基于此.国内的一家创业公司推出了智能型Android真机白盒測试以及开发辅助类 ...

  4. python自动化测试工具selenium使用指南

    概述 selenium是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等.官网地址为:https://www.selenium.dev/.相对于另外一款web自动化测试工具QTP ...

  5. Eclipse插件(导出UML图,打开文件资源管理器插件,静态代码分析工具PMD,在eclipse上安装插件)

    目录 能够导出UML图的Eclipse插件 打开文件资源管理器插件 Java静态代码分析工具PMD 如何在eclipse上安装插件 JProfiler性能分析工具 从更新站点安装EclEmma 能够导 ...

  6. GTest Google的一种白盒单元测试框架 开源项目

    GTest为google开源的白盒单元测试跨平台测试框架,含丰富的断言.类型参数化测试.死亡测试.以及其他的测试选项设置.文件保存等,以下将对该项目C++的实现进行简要的分析,作为学习记录备份. 基本 ...

  7. 常用自动化测试工具介绍(支持B/S、C/S)

    一.功能测试工具1.QTP测试工具 全名HP QuickTest Professional software ,最新的版本为HP QuickTest Professional 11.0 QTP是qui ...

  8. APP移动端自动化测试工具选型“兵器谱”一览(主流开源工具)

    (下面大多数工具都是开源工具,在github,码云等开源平台都能找到) "测试那点事儿”在看到360旗下的测试团队整理的关于目前APP移动端自动化相关的工具,觉得总结的很到位,对目前大多数中 ...

  9. 商业级别Fortify白盒神器介绍与使用分析

    转自:http://www.freebuf.com/sectool/95683.html 什么是fortify它又能干些什么? 答:fottify全名叫:Fortify SCA ,是HP的产品 ,是一 ...

随机推荐

  1. 洛谷 P2054 [AHOI2005]洗牌

    题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...

  2. PS制作gif动图教程

    之前做过一些动图,时间久了就忘记了,每次心血来潮想做的时候又要重新找资料,网上的教程都不够完整,因此整理了一份完整的教程,针对PS新手(对,没错,就是博主自己哈哈). 准备工作:photoshop.图 ...

  3. 原型模式(ProtoType)

    用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节. .Net 在 system 命名空间中提供了I ...

  4. python气象分析

    数据分析实例 -- 气象数据 一.实验介绍 本实验将对意大利北部沿海地区的气象数据进行分析与可视化.我们在实验过程中先会运用 Python 中matplotlib库的对数据进行图表化处理,然后调用 s ...

  5. openStack 租户控制台修改虚拟机账户密码

    - cloud-init方式 该种方式需要虚拟机镜像安装cloud-init,将重置密码脚本注入到虚拟机中.nova boot –image=image-id –nic net-id=net-id – ...

  6. DDoS攻防战 (二) :CC攻击工具实现与防御理论

    故上兵伐谋 其次伐交 其次伐兵 其下攻城 攻城之法 为不得已 知己知彼 百战不殆 不知彼而知己 一胜一负 不知彼不知己 每战必败 ——孙子兵法·谋攻 我们将要实现一个进行应用层DDoS攻击的工具,综合 ...

  7. IOS CFBundleIdentifier

    CFBundleIdentifier  CFBundleIdentifier 必须是com.12306.aaa 这样的格式吗       AppID   用通配符格式的AppID方便.   AppSt ...

  8. 16 python 异常处理

    1.了解什么是异常处理 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止), 在python中,错误触发的异常如下 2.了解 ...

  9. kafka 修改partition,删除topic,查询offset

    修改分区个数: ./kafka-topics./kafka/<id_of_kafka> --alter --partitions 10 --topic test_topic 上面命令将te ...

  10. spring cloud 消费者

    本消费者  加了 Hystrix, 为了后续监控用. 1. 依赖: <parent> <groupId>org.springframework.boot</groupId ...