本文討論了如何以遞進的方式使用apache Ant來改善我們的代碼質量。並按著三步走的原則給出了具體的實現步驟。
一、充分利用單元測試、代碼覆蓋
單元測試、代碼覆蓋是最容易被接受和實現的方式。事實上,大多數開發人員都知道單元測試對他們很重要。在我們開始討論這些東西之前,先看一下Google研究院主管Peter Norvig的一段話:“如果你認為你們不需要對自己的代碼進行單元測試,那麼就寫在紙上寫一所有的原因,並且仔細研究這張紙,然後扔了它,繼續測試自己的程序吧”。看來Google也是非常推崇進行單元測試的。那麼誰又來測試那麼測試者呢?也就是說,我們怎麼能驗證對程序做了足夠的測試呢?這是一個非常有價值的問題,因為那些未通過測試的程序才是我們更應該關注的地方。這個問題的一個解決方案就是使用代碼覆蓋工具,這種工具將告訴我們我們到底測試了多少代碼(也就是被測試代碼的百分比),然後使用一般的綜合處理來合並覆蓋核對結果。如果覆蓋核對失敗,那麼我們建立應用程序的過程也就失敗了。
對了本文所討論的遞增代碼策略選擇了代碼覆蓋工具Cobertura,這是由於它非常容易使用,而且擁有良好的定義格式,以及四個Ant任務接口。這些任務之一就是cobertura-check,當代碼不能完成我們要求的覆蓋率時,它就會失敗。如下面的代碼顯示如果覆蓋率未達到80%,Ant在建立工程時就會失敗:
除了使用硬編碼來指定這個覆蓋率外,我們還可能以使用一個更容易建立的結果作為當前核對的覆蓋率。我們可以通過使用兩個核心Ant任務連接一對Cobertura任務來完成這個任務。並不不用擔心各種覆蓋率的具體的值。我們的目標是完成可測量的代碼改善,而不是設置一個絕對的代碼覆蓋率。
在建立用於測試和運行我們的代碼的targets後,我們可以將用於核對我們的建立腳本的增量覆蓋率。第一步是使用一個cobertura報吿任務建立一個XML格式的覆蓋報表。代碼如下:
下面是由一個cobertura報表任務產生的
現在要確保將這個文件保存在某個硬盤上,因為我們在後面會需要這個文件。
二、從報表中取出覆蓋率
一開始,我們可以試著使用Ant的XMLProperty任務來直接獲得這個覆蓋率,並給一個Ant屬性。但是這個方法有以下兩個問題:
1. 在coverage.XML中的覆蓋率是一個小數,但當核對任務時需要一個整數百分比。
2. 在實際的項目中,coverage.xml的文件尺寸非常大,如果在Java中嘗試使用XMLProperty任務時可能會出現Java OutOfMemoryError錯誤。而我們只想從coverage.XML文件中獲得以下的內容:
上面的簡單的XSL模板需要產生一個只包含我們需要的值的屬性文件,內容如下:
要注意的是方法floor(@line-rate*100),可以將小數覆蓋率轉換為整型覆蓋率。最終結果是一個只包含下面一行的coverage.propertIEs文件:
total.line-rate=44
現在我們可以使用Ant的屬性任務來從coverage.propertIEs讀取這個Ant屬性所需要的覆蓋率:
最後,我們可以將最初的"80"使用新的Ant屬性替換,代碼如下:
三、將內容放到一起
最後的build.XML文件看上去的形似如下:
要注意一個新的覆蓋報告僅僅當覆蓋核對被通過後才能被產生,也就是說,每次提高覆蓋率後,都會比上一次建立的代碼質量有所提高。
四、改善跟蹤率的其他方法
還有一些遞增地改善代碼質量的方法是通過將覆蓋率記錄到文件中來跟蹤代碼改善率。我們可以通過Ant的echo任務建立如下的代碼:
五、結果可測量、改善可視化
經過對一個工程的測試,在這個工作使用本文所提供的策略後的一周內定,這個工程的代碼質量改善了超過30%.而更另人興奮的是以前開發人員都不需要對代碼進行測試,而現在它們會為通過測試而使他們的代碼質量的提高感到驕傲。
當然,我們不需要只停留在本文所介紹的方法和理論上。我們也可以將增量改善策略用在其他的代碼規則中。因為大多數的代碼核對工具都可以產生基於XML格式的輸出,我們可以使用XSL模板來過濾出與之相關的代碼規則,並將這些規則作為當前的代碼核對工具的輸入。