【技術猩球】開源啦! Go 語言系統測試覆蓋率收集利器 goc

工程效能領域,測試覆蓋率度量總是繞不開的話題,我們也不例外。在七牛雲,我們主要使用go語言構建雲服務,在考慮系統測試覆蓋率時,最早也是通過圍繞原生 go test -c -cover 的能力來構建。且我們已經做了很多自動化工作,能夠針對很多類型的代碼庫,自動插樁服務,自動生成 TestMain() 等方法,但隨着接入項目越來越多,以及後面使用場景的不斷複雜化,我們發現這套方案還是有其先天侷限,會讓後面越來越難受:

程序必須關閉才能收集覆蓋率。如果將這套系統僅定位在收集覆蓋率數據上,這個痛點倒也能忍受。但是如果想進一步做精準測試等方向,就很受侷限。

因爲不想污染被測代碼庫,我們採取了自動化的方式,在編譯階段給每個服務生成類似 main_test.go 文件。但這種方式,其最難受的地方在於 flag 的處理,要知道 go test 命令本身會調用 flag.Parse 方法,所以這裏需要自動化的修改源碼,保證被測程序的flag定義,要先於 go test 調用 flag.Parse 之前。但是,隨着程序自己使用flag姿勢的複雜化,我們發現越來越難有通用方案來處理這些 flag,有點難受。

受限於 go test-c 命令的先天缺陷,它會給被測程序注入一些測試專屬的 flag,比如 -test.coverprofile, -test.timeout 等等。這個是最難受的,因爲它會破壞被測程序的啓動姿勢。我們知道系統測試面對是完整被測集羣,如果你需要專門維護一套測試集羣來做覆蓋率收集時,就會顯得非常浪費。好鋼就應該用在刀刃上,在七牛雲,我們倡導極客文化,追求用工程師思維解決重複問題,而作爲業務效率部門,我們自己更應該走在前列。

也是因爲以上的種種考量,我們內部一直在優化這一套系統,到今天這一版,我們已從架構和實現原理上完成了顛覆,能夠做到無損插樁,運行時分析覆蓋率,當屬非常優雅。

Goc - A Comprehensive Coverage Testing System for The Go Programming Language

一圖勝千言:

使用 goc run.的姿勢直接運行被測程序,就能在運行時,通過 goc profile命令方便的得到覆蓋率結果。是不是很神奇?是不是很優雅?

這個系統就是 goc,在設計和使用體驗上希望向 go 核心命令 (go build/install/run) 靠攏,以提升用戶體驗。以下是最新支持的功能列表:

系統測試覆蓋率收集方案

有了 goc,我們再來看如何收集 go 語言系統測試覆蓋率。整體比較簡單,大體只需要三步:

首先通過 goc server命令部署一個服務註冊中心,它將會作爲樞紐服務跟所有的被測服務通信。

使用 goc build--center="

環境部署好之後,就可以做執行任意的系統測試。而在測試期間,可以在任何時間,通過 goc profile--center="

是不是很優雅?

goc 核心原理及未來

goc 在設計上,拋棄老的 go test-c-cover模式,而是直接與 go tool cover工具交互,避免因 go test命令引入的一系列弊端。goc 同樣沒有選擇自己做插樁,也是考慮 go 語言的兼容性,以及性能問題,畢竟 go tool cover工具,原生採用結構體來定義 counter 收集器,每個文件都有單獨的結構體,性能相對比較可靠。goc 旨在做 go 語言領域綜合性的覆蓋率工具以及精準測試系統,其還有很長的路要走:

基於 PR 的單測/集測/系統覆蓋率增量分析

精準測試方向,有一定的產品化設計體驗,方便研發與測試日常使用

擁抱各種 CICD 系統

當前 goc 已經開源了(https://github.com/qiniu/goc),歡迎感興趣的同學,前往代碼倉庫查看詳情並 Star 支持。當然,我們更歡迎有志之士,能夠參與貢獻,和我們一起構建這個有意思的系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章