本文讨论了如何以递进的方式使用Apache Ant来改善我们的代码质量并按着三步走的原则给出了具体的实现步骤
一充分利用单元测试代码覆盖
单元测试代码覆盖是最容易被接受和实现的方式事实上大多数开发人员都知道单元测试对他们很重要在我们开始讨论这些东西之前先看一下Google研究院主管Peter Norvig的一段话如果你认为你们不需要对自己的代码进行单元测试那么就写在纸上写一所有的原因并且仔细研究这张纸然后扔了它继续测试自己的程序吧看来Google也是非常推崇进行单元测试的那么谁又来测试那么测试者呢?也就是说我们怎么能验证对程序做了足够的测试呢?这是一个非常有价值的问题因为那些未通过测试的程序才是我们更应该关注的地方这个问题的一个解决方案就是使用代码覆盖工具这种工具将告诉我们我们到底测试了多少代码(也就是被测试代码的百分比)然后使用一般的综合处理来合并覆盖核对结果如果覆盖核对失败那么我们建立应用程序的过程也就失败了
对了本文所讨论的递增代码策略选择了代码覆盖工具Cobertura这是由于它非常容易使用而且拥有良好的定义格式以及四个Ant任务接口这些任务之一就是coberturacheck当代码不能完成我们要求的覆盖率时它就会失败如下面的代码显示如果覆盖率未达到%Ant在建立工程时就会失败
<target name=coverage_check>
<coberturacheck totallinerate=/>
</target name=coverage_check>
除了使用硬编码来指定这个覆盖率外我们还可能以使用一个更容易建立的结果作为当前核对的覆盖率我们可以通过使用两个核心Ant任务连接一对Cobertura任务来完成这个任务并不不用担心各种覆盖率的具体的值我们的目标是完成可测量的代码改善而不是设置一个绝对的代码覆盖率
在建立用于测试和运行我们的代码的targets后我们可以将用于核对我们的建立脚本的增量覆盖率第一步是使用一个cobertura报吿任务建立一个XML格式的覆盖报表代码如下
<coberturareport format=xml/>
下面是由一个cobertura报表任务产生的
coveragexml
<?xml version=?>
<!DOCTYPE coverage SYSTEM dtd>
<coverage linerate= branchrate= version= timestamp=>
<sources>
<source>/src/java</source>
</sources>
<packages>
……
</packages>
</coverage>
现在要确保将这个文件保存在某个硬盘上因为我们在后面会需要这个文件
二从报表中取出覆盖率
一开始我们可以试着使用Ant的XmlProperty任务来直接获得这个覆盖率并给一个Ant属性但是这个方法有以下两个问题
在coveragexml中的覆盖率是一个小数但当核对任务时需要一个整数百分比
在实际的项目中coveragexml的文件尺寸非常大如果在Java中尝试使用XmlProperty任务时可能会出现Java OutOfMemoryError错误而我们只想从coveragexml文件中获得以下的内容
<xslt in=coveragexml out=build/coverageproperties />
上面的简单的XSL模板需要产生一个只包含我们需要的值的属性文件内容如下
<xslstylesheet xmlnsxsl= version=>
<xsloutput method=text omitxmldeclaration=yes/>
<xsltemplate match=coverage>
totallinerate=
<xslvalueof select=floor(@linerate*)/>
</xsltemplate>
</xslstylesheet>
要注意的是方法floor(@linerate*)可以将小数覆盖率转换为整型覆盖率最终结果是一个只包含下面一行的coverageproperties文件
totallinerate=
现在我们可以使用Ant的属性任务来从coverageproperties读取这个Ant属性所需要的覆盖率
<property file=build/coverageproperties />
最后我们可以将最初的使用新的Ant属性替换代码如下
<coberturacheck totallinerate=${totallinerate}/>
三将内容放到一起
最后的buildxml文件看上去的形似如下
<target name=coverage_check depends=check_against_previous_rate>
<antcall target=coverage_report/>
</target>
<target name=coverage_report>
<coberturareport format=xml destdir= />
</target>
<target name=check_against_previous_rate depends=coverage_xml_to_properties>
<property file=build/coverageproperties />
<coberturacheck totallinerate=${coveragelinerate} />
</target>
<target name=coverage_xml_to_properties>
<xslt in=coveragexml out=build/coverageproperties />
</target>
要注意一个新的覆盖报告仅仅当覆盖核对被通过后才能被产生也就是说每次提高覆盖率后都会比上一次建立的代码质量有所提高
四改善跟蹤率的其他方法
还有一些递增地改善代码质量的方法是通过将覆盖率记录到文件中来跟蹤代码改善率我们可以通过Ant的echo任务建立如下的代码
<target name=time>
<tstamp>
<format property=datetime pattern=yyyyMMdd HHmm/>
</tstamp>
</target>
<target name=log depends=time>
<echo file=${historytxt} append=true>
${datetime}totallinerate${totallinerate}
</echo>
</target>
五结果可测量改善可视化
经过对一个工程的测试在这个工作使用本文所提供的策略后的一周内定这个工程的代码质量改善了超过%而更另人兴奋的是以前开发人员都不需要对代码进行测试而现在它们会为通过测试而使他们的代码质量的提高感到骄傲
当然我们不需要只停留在本文所介绍的方法和理论上我们也可以将增量改善策略用在其他的代码规则中因为大多数的代码核对工具都可以产生基于XML格式的输出我们可以使用XSL模板来过滤出与之相关的代码规则并将这些规则作为当前的代码核对工具的输入