Code coverage for your AWK programs

Ben Hoyt

為你的 AWK 程式提供程式碼涵蓋率

原文由 Ben Hoyt 發布,訂閱此部落格

更新: 這項功能的作者 Volodymyr Gubarkov 已針對 GoAWK 的程式碼涵蓋率報告、他如何想到這個點子以及它的運作方式撰寫了他自己的文章

雖然我是 GoAWK 的作者,但我自己並不會用 AWK 來寫多行的指令稿。我通常用 Python 來寫腳本,而 AWK 則是用在終端機裡的一行指令。

不過,有些人確實會用 AWK 來寫較長的程式,從實用的到令人驚豔的都有:

Gron.awkMakesure 都是由烏克蘭開發者 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 回報。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言