參考 Google Peter Norvig 觀點:「若覺得不需要單測,寫下理由後扔掉,繼續測試。」關鍵在於如何驗證測試充分性 —— 引入代碼覆蓋率工具,建立增量門檻,每次建構必須超越上次質量基線。
<!-- build.xml 片段 -->
<taskdef resource="cobertura.tasks" classpathref="cobertura.classpath"/>
<target name="cobertura-check">
<cobertura-instrument todir="${instrumented.dir}">
<fileset dir="${build.classes}"><include name="**/*.class"/></fileset>
</cobertura-instrument>
<junit fork="yes" forkmode="once">
<classpath><pathelement location="${instrumented.dir}"/></classpath>
<batchtest><fileset dir="${test.classes}" includes="**/*Test.class"/></batchtest>
</junit>
<cobertura-report format="xml" destdir="${report.dir}" />
<!-- 硬性門檻:行覆蓋率 ≥ 80% -->
<cobertura-check branchrate="70" linerate="80" totalbranchrate="70" totallinerate="80" haltOnFailure="true" />
</target>
避免硬編碼 80% 導致存量專案無法起步。實現邏輯:
coverage.xml。line-rate,轉整數百分比寫入 coverage.properties。<xsl:template match="/coverage">
total.line-rate=<xsl:value-of select="floor(@line-rate*100)"/>
</xsl:template>
<property file="coverage.properties"/>。${total.line-rate} (或 +1%)。<cobertura-check totallinerate="${total.line-rate}" haltOnFailure="true"/>
效果:每次提交必須提升或持平覆蓋率,質量單調遞增,無倒退。
<target name="track-coverage">
<echo message="Coverage baseline updated: ${total.line-rate}%"/>
<echo file="coverage.history" append="true">${DSTAMP} ${TSTAMP} ${total.line-rate}%</echo>
</target>
coverage.history 可繪製趨勢圖 (Excel/Grafana/Confluence 圖表巨集)。<target name="build" depends="compile, test, cobertura-report, cobertura-check, track-coverage" />
關鍵點:cobertura-check 通過後才生成新報告,確保歷史基線始終對應「通過門檻的版本」。
統一模式:工具產出 XML -> XSLT 過濾關鍵指標 -> Ant 屬性化 -> 遞增門檻 -> 趨勢記錄。
「一週內代碼質量提升 30%+,開發者從抗拒測試轉為以通過門檻為榮,質量文化自發形成。」