靜態分析(含類型檢查)覆蓋所有可能運行路徑,但約束表達力有限;單元測試可驗證複雜約束,但僅覆蓋特定輸入。**二者非對立,而是強互補關係**。
| 單元測試長處 | 靜態分析長處 |
|---|---|
| 展示常用執行路徑,揭示程式實際運作方式 | 檢查測試覆蓋範圍,發現未測試代碼區域 |
| 作為可執行文檔,推導推測性不變量 | 從一般到特殊驗證不變量,或插入運行時斷言 |
MIT 免費實驗性工具。分析程式運行(如單元測試),推導不變量(如 i < length),詢問用戶確認後插入為斷言。若報告大量不想要的不變量,暗示測試輸入缺乏代表性。
// VectorAdapter 測試
v.insert("this"); v.insert("is"); v.insert("a"); v.insert("test");
assertEquals("a", v.lookup(2));
// Daikon 可能推導:lookup 的參數 i 永遠 < length
Ant 外掛,商業軟體(開源專案免費)。兩階段:編譯期探針插桿 → 測試期收集數據 → 生成 HTML/文本/Swing 報告。
// build.xml 片段
<property name="clover.initstring" value="/tmp/mycoverage.db"/>
<target name="with.clover">
<property name="build.compiler" value="org.apache.tools.ant.taskdefs.CloverCompilerAdapter"/>
</target>
<target name="clover.report">
<java classname="com.cortexeb.tools.clover.reporters.html.HtmlReporter">
<arg line="--outputdir /tmp/clover_html --showSrc --initstring ${clover.initstring} --title 'My Project'"/>
</java>
</target>
// 執行
$ ant with.clover compile test
$ ant clover.report
極限編程團隊可整合至提交流程:強制測試通過且覆蓋率達標方可提交,防止偷懶與疏漏。
單元測試展示「程式如何運行」;靜態分析檢查「所有可能運行的屬性」。雙劍合璧,構建鋼鐵級代碼品質防線。