Java 理论与实践: 平衡测试,第 1 部分:不要仅编写测试,还要编写 bug 检测器
2010-01-11 00:00:00 来源:WEB开发网将检测器包装为插件
创建新的 bug 检测所需的最后一步是将其打包为一个插件。FindBugs 插件包含一个或多个 bug 检测器、一个部署描述符和一个资源文件,它们被打包成一个 JAR 文件,放在 FindBugs 安装的插件目录中。称为 findbugs.xml 的部署描述符将定义已知的 bug 检测器和它报告的错误。称为 messages.xml (对于本地化版本称为 messages_xx.xml)的资源文件定义特定于语言的、将由 FindBugs GUI 使用的字符串,用它描述所报告的 bug。清单 5 和清单 6 显示了示例 bug 检测器的部署描述符和资源文件。插件 JAR 中可以包括多个资源文件的本地版本;部署描述符和资源文件放置在插件 JAR 的顶级目录中。
清单 5. 示例 bug 检测器的部署描述符<FindbugsPlugin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="findbugsplugin.xsd"
pluginid="com.briangoetz.findbugs.plugin"
defaultenabled="true"
provider="Brian Goetz"
website="http://www.briangoetz.com">
<Detector class="com.briangoetz.findbugs.plugin.CallSystemGC"
speed="fast"
reports="SYSTEM_GC" />
<BugPattern abbrev="GC" type="SYSTEM_GC" category="PERFORMANCE" />
</FindbugsPlugin>
<
清单 6. 示例 bug 检测器的资源文件<MessageCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="messagecollection.xsd">
<Plugin>
<ShortDescription>Brian's plugin</ShortDescription>
<Details></Details>
</Plugin>
<Detector class="com.briangoetz.findbugs.plugin.CallSystemGC">
<Details>
<![CDATA[
Finds calls to System.gc().
]]>
</Details>
</Detector>
<BugPattern type="SYSTEM_GC">
<ShortDescription>Method calls System.gc()</ShortDescription>
<LongDescription>Call to System.gc() method in {1}</LongDescription>
<Details>
<![CDATA[
Library code should not call System.gc()
]]>
</Details>
</BugPattern>
<BugCode abbrev="GC" >Garbage collection</BugCode>
</MessageCollection>
根据 JDK 1.4.2 类库构建和包装插件,并运行它,这会为我们带来意想不到的效果:com.sun.imageio 中的几个类(包括 JPEGImageReader 和 JPEGImageWriter)将调用 System.gc()!此结果还有另一个好处,即静态分析的灵活性:创建 bug 检测器后,它可以在任何地方查找 bug。
结束语
静态分析和自定义 bug 检测器是提高软件质量的非常有效的方法。通过为已知 bug 模式创建检测器,我们不仅可以在特定项目的当前代码基址中搜索 bug 模式,还可以在当前或以后的任何项目中搜索 bug 模式。创建 bug 检测器所付出的额外努力将来会为您带来质量方面的丰厚回报。
本文示例源代码或素材下载
更多精彩
赞助商链接