這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Golang中的覆蓋率測試
golang中提供了不少工具鏈,可以使用它們方便的進行單元測試、分析效能瓶頸,提供運行時資訊等,總而言之是非常有用的。
go test這個工具大家用的應該比較多,之前我使用也大多是用來做單元測試的,go中做單元測試非常的方便,然而我忽視了覆蓋率測試。
單元測試覆蓋了多少代碼呢?golang的go test工具其實還支援顯示覆蓋率,最簡單的用法就是執行
go test -c -covermode=count -coverpkg ./...
來編譯一個尾碼為.test的可執行檔,執行後,它會執行所有的單元測試代碼,然後輸出覆蓋率的報告。
這其實是統計單元測試的覆蓋率,也就是白盒測試的覆蓋率。
然而我們這裡的功能測試告訴我,這個還支援黑箱測試的覆蓋率統計,我那時候還楞了一下,想了想不大可能吧。於是測試給我發了下面這個文章,我自己讀了下,真是大腦洞,真想的出來。
文章
按著這份文章,就是在某個單元測試檔案中,定義一個函數,當某個flag被提供的時候,執行main函數來運行主迴圈。
package mainimport ( "flag" "testing" "github.com/cihub/seelog")var systemTest *boolvar testConfigPath *stringfunc init() { systemTest = flag.Bool("systemTest", false, "Set to true when running system tests") testConfigPath = flag.String("configpath", "", "-configpath <lua config file path>")}func TestEntry(t *testing.T) { // system tests? flag.Parse() if *systemTest { seelog.Info("system test running main") // set the configpath variable g_configpath = testConfigPath main() }}
當然我的本體程式本身就有一個輸入參數,這裡就做了個小技巧,在init函數裡把參數全解析了,假設解析了原始的參數,則賦值給main中的參數變數,main會判斷這個變數是否被初始化了,假設沒有的話,會再次的進行flag的讀取。