為你的 AWK 程式提供程式碼涵蓋率
更新: 這項功能的作者 Volodymyr Gubarkov 已針對 GoAWK 的程式碼涵蓋率報告、他如何想到這個點子以及它的運作方式撰寫了他自己的文章。
雖然我是 GoAWK 的作者,但我自己並不會用 AWK 來寫多行的指令稿。我通常用 Python 來寫腳本,而 AWK 則是用在終端機裡的一行指令。
不過,有些人確實會用 AWK 來寫較長的程式,從實用的到令人驚豔的都有:
- Gron.awk,JSON 扁平化工具 Gron 的複刻版。
- Makesure,一款受 Make 啟發的建置工具。
- AWKTC,一款在終端機上執行的俄羅斯方塊遊戲。
- 復古風展示程式,在終端機中以 30 FPS 執行。
Gron.awk 和 Makesure 都是由烏克蘭開發者 Volodymyr Gubarkov 所撰寫,他同時也打造了 intellij-awk,也就是「欠缺的 IntelliJ IDEA AWK 語言支援外掛」。
幾個月前,Volodymyr 在 GoAWK 儲存庫中開了一個議題,表示他正在為 GoAWK 加入程式碼涵蓋率功能,「類似於 Golang 本身內建的功能」。像這樣有趣的投稿並不常見,再加上 Volodymyr 先前已經提交過幾個高品質的錯誤回報,所以我很信任他的能力。
我也覺得,能夠說GoAWK 是我們所知唯一支援程式碼涵蓋率的 AWK 實作,是一件很酷的事。
多虧 Volodymyr 的努力,GoAWK 1.21.0 版已納入程式碼涵蓋率功能。在主要的程式碼變更之前,還需要進行一些 重構——再次感謝 Volodymyr 耐心地完成了這一切,才有了主要的程式碼變更。
如果你正在撰寫並測試較大型的 AWK 程式,或許會覺得這個功能很實用!關於如何使用這項功能以及它的運作原理,以下引述自涵蓋率文件:
以下是在一個簡單的 AWK 程式(prog.awk)上使用 GoAWK 涵蓋率功能的螢幕截圖:

基本用法
要產生涵蓋率報告,最簡單的方式就是在執行 AWK 程式時加上 -coverprofile 選項。若要以預設的涵蓋率模式執行程式,並將涵蓋率報告寫入 cover.out,請執行以下指令:
$ goawk -f prog.awk -coverprofile cover.out
will always run
should run
這會為 prog.awk 的執行產生一個包含涵蓋率設定檔資料的 cover.out 檔案。
我們仰賴 Go 工具鏈來視覺化涵蓋率報告,具體來說是 go tool cover 這個指令。這個指令會將涵蓋率報告轉譯為 HTML。如果你還沒安裝 Go,請立即安裝。
若要將 HTML 格式的涵蓋率報告(如上方截圖所示)寫入暫存檔並用網頁瀏覽器開啟,請執行以下指令:
$ go tool cover -html=cover.out
若要將 HTML 檔案寫入指定的檔案,而非啟動網頁瀏覽器,請使用 -o:
$ go tool cover -html=cover.out -o cover.html
如果你想查看標註了涵蓋率資訊的原始碼,請在 -covermode 之外再加上 -d 選項。這對於除錯,或是想了解 GoAWK 涵蓋率功能在底層如何運作時可能會很有幫助:
$ goawk -f prog.awk -covermode set -d
BEGIN {
__COVER["3"] = 1
print "will always run"
if ((1 + 1) == 2) {
__COVER["1"] = 1
print "should run"
} else {
__COVER["2"] = 1
print "won't run"
}
}
所有命令列選項
-coverprofile fn:將涵蓋率報告的檔名設為fn。如果指定了此選項但未指定-covermode,涵蓋率模式預設為set。-covermode mode:將涵蓋率模式設為mode,可為下列其中之一:set:每個陳述式是否有執行?count:每個陳述式執行了幾次?(會產生熱力圖報告)
-coverappend:附加到涵蓋率設定檔,而非覆寫它。這讓你可以在多次不同的程式執行中累積涵蓋率資料。
祝使用愉快!如有任何錯誤,請透過GitHub issues 回報。
隨機一篇部落格
留言
登入後參與討論