本文討論了如何以遞進的方式使用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模板來過濾出與之相關的代碼規則並將這些規則作為當前的代碼核對工具的輸入
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26143.html