白盒静态自动化测试工具: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 3:
3 在Eclipse中使用PMD操作步骤
3.1 激活PMD插件
Ecplise的菜单Project->Properties->PMD,在这个窗口选择要应用的规则,并指定相对重要性,为特定项目详细配置PMD,目前只需要选中Enable PMD复选框,保留默认规则集。
3.3 执行PMD任务
单击项目资源,右键->PMD->Check code with PMD。在Violation OverView视图中按问题严重程度列出PMD问题。
在ViolationsoutLinew右键show Details可以查看更详细的规则描述以及说明规则的示例代码。
- 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比较方便。
忽略问题(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使用指南的更多相关文章
- 白盒静态自动化测试工具:FindBugs使用指南
目 录 1 FINDBUGS介绍 2 在ECLIPSE中安装FINDBUGS插件 3 在ECLIPSE中使用FINDBUGS操作步骤 3.1 ...
- JAVA语言搭建白盒静态代码、黑盒网站插件式自动化安全审计平台
近期打算做一个插件化的白盒静态代码安全审计自动化平台和黑盒网站安全审计自动化平台.现在开源或半开源做黑盒网站安全扫描的平台,大多是基于python脚本,安全人员贡献python脚本插件增强平台功能.对 ...
- 移动測试技术保护源码!解码全球首款移动端白盒測试工具ThreadingTest (文章转自己主动点科技)
作者 智晓锋 - 2014/07/14 自从斯诺登曝光美监听丑闻事件之后,我国政府就将信息安全问题上升到了国家安全的高度.基于此.国内的一家创业公司推出了智能型Android真机白盒測试以及开发辅助类 ...
- python自动化测试工具selenium使用指南
概述 selenium是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等.官网地址为:https://www.selenium.dev/.相对于另外一款web自动化测试工具QTP ...
- Eclipse插件(导出UML图,打开文件资源管理器插件,静态代码分析工具PMD,在eclipse上安装插件)
目录 能够导出UML图的Eclipse插件 打开文件资源管理器插件 Java静态代码分析工具PMD 如何在eclipse上安装插件 JProfiler性能分析工具 从更新站点安装EclEmma 能够导 ...
- GTest Google的一种白盒单元测试框架 开源项目
GTest为google开源的白盒单元测试跨平台测试框架,含丰富的断言.类型参数化测试.死亡测试.以及其他的测试选项设置.文件保存等,以下将对该项目C++的实现进行简要的分析,作为学习记录备份. 基本 ...
- 常用自动化测试工具介绍(支持B/S、C/S)
一.功能测试工具1.QTP测试工具 全名HP QuickTest Professional software ,最新的版本为HP QuickTest Professional 11.0 QTP是qui ...
- APP移动端自动化测试工具选型“兵器谱”一览(主流开源工具)
(下面大多数工具都是开源工具,在github,码云等开源平台都能找到) "测试那点事儿”在看到360旗下的测试团队整理的关于目前APP移动端自动化相关的工具,觉得总结的很到位,对目前大多数中 ...
- 商业级别Fortify白盒神器介绍与使用分析
转自:http://www.freebuf.com/sectool/95683.html 什么是fortify它又能干些什么? 答:fottify全名叫:Fortify SCA ,是HP的产品 ,是一 ...
随机推荐
- 并发基础(九) java线程的终止与中断
1.简单了解一下:为何不赞成使用 Thread.stop.Thread.suspend 和 Thread.resume? suspend .resume.stop方法分别完成了线程的暂停.恢复.终 ...
- Trace VM
24小时稳定性压测Trace 高并发情况下主要观察VM运行情况 一.总体概览 如上图所示 持久代十分稳定,没有发生OOM 二.VM区域详情 上图为VM每个区间的具体情况 1.持久代始终占分配空间的四分 ...
- uva-10054-欧拉回路
题意:一个项链上面的每一个珠子有俩种颜色,前面一个珠子后面的颜色和后面珠子的前面颜色一样,有一天它断了, 一个人去搜集,问,搜集到的珠子能不能再次串成项链 原以为是链表,原来链表这组数据过不了. 71 ...
- 1_Utilities__deviceQuery + 1_Utilities__deviceQueryDrv + 1_Utilities__topologyQuery
使用 Runtime API 和 Driver API 检测设备相关属性.并检测了设备之间的拓扑以及主机与设备之间的拓扑(是否支持跨设备原子操作). ▶ 源代码:Runtime API #includ ...
- 60. vbe6ext.olb 不能被加载
找到C:\Program Files\Common Files\Microsoft Shared\VBA\路径: 把VBA6文件夹下面的VBE6.DLL改为:VBE7.DLL (如果没有VBA6文件夹 ...
- 使用seaborn制图(小提琴图)
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 设置风格, ...
- PadLeft 补零
补零 PadLeft -Caption.Length())+Caption; UnicodeString __fastcall StringOfChar(WideChar Ch, int Count) ...
- jboss 异常处理
异常: jboss.aop:service=AspectManager 15:19:46,361 ERROR [ScannerThread] [MainDeployer] org.jboss.depl ...
- 3 Python 函数介绍
1.函数的基本概念 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 语法定义 def ...
- vc 读xml文件 宏
自定义FOREACH循环,便于coding 在指定xml的nodelist b中遍历每个节点 #define FOREACH_NODE(a,b)\ long cnt = 0; \ CComPtr< ...