白盒静态自动化测试工具: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浅析
- Element:检查的文件;
- Violation/LOC(lineofcode缩写)为:警告个数/源代码行数x1000;
- Violations/Method:警告个数除以方法个数(类中每个方法中的平均错误);
- Project:所在项目
右键点击框体的任意位置显示4个选项按钮对应的功能为
- Filter Resource:是否展示下列工程
- Filter Priorities:想要展示的警告等级(5个等级,红色为最严重的警告)
- Presentation Type:展示的结构
- clear PMD violations:清除Violations Outline内的信息
具体处理问题,还是利用Violations Outline比较方便。
查看详细(Show Details):显示错误的详细信息 显示错误的详细信息,如右图所示:
手工纠正(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进行检查。
- //ClassBody [count(//VariableDeclarator[../Type/Name[@Image='Logger']])>1] ,这个表达式就是查找类的代码里是否声明了多个 Logger ;
- 然后编写一个 ruleset 的 XML 文件;
- 最后运行 PMD 进行检查。
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-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/
浮生潦草闲愁广,一听啤酒一口尽