背景
很多人記錄過怎么執行Go test單個文件或者單個函數,但是要么對執行單文件用例存在函數或變量引用的場景避而不談,要么提示調用了其它文件中的模塊會報錯。其實了解了go test命令的機制之后,這個問題就迎刃而解了。
也是一個同事向我求助我才知道有這樣一個問題存在,因為場景特殊他只想執行我們的測試代碼其中一個文件中的測試代碼,因為調用的信息都在同一目錄(package)下,原代碼執行是不存在引用問題的,直接執行go test
也是可以運行的,但是單獨運行其中一個文件時,出現了下面的錯誤:
bingo@Mac Interface_test$ go test -v getinfo_test.go
# command-line-arguments
./getinfo_test.go:34:23: undefined: touch
./getinfo_test.go:35:23: undefined: verify
...
FAIL command-line-arguments [build failed]
這也許是很多數人會遇到的一個錯誤,搜索引擎上沒有找到相關的信息,有的人做了相關的記錄來提示后來人:執行單文件存在引用時會報錯。
這可能也是使用golang 做測試的弊端,因為發展時間不長,沒有像Python或者Java那樣成熟的社區;廢話不多說,我們一起來看看這個問題為什么會發生。
根本原因
其實從看看上面的這段提示:build failed
,構建失敗,我們應該就能看出一下信息。go test與其他的指定源碼文件進行編譯或運行的命令程序一樣(參考:go run
和go build
),會為指定的源碼文件生成一個虛擬代碼包——“command-line-arguments”,對於運行這次測試的命令程序來說,測試源碼文件getinfo_test.go
是屬於代碼包“command-line-arguments”的,可是它引用了其他包中的數據並不屬於代碼包“command-line-arguments”,編譯不通過,錯誤自然發生了。
解決方法
解決
知道了原因之后,解決的方法就出來了,執行命令時加入這個測試文件需要引用的源碼文件,在命令行后方的文件都會被加載到command-line-arguments
中進行編譯。。示例如下:
bingo@Mac Interface_test$ go test -v getinfo_test.go lib.go
ok command-line-arguments 0.008s
多級引用或多個引用包的情況
如果對多個包存在引用關系,或者引用的包對當前目錄的其他文件存在引用,也都是一樣的方法,把他們加在命令后方即可。
下面這個是一個多引用包的實例:
總結
測試單個文件,一定要帶上被測試的原文件,如果原文件有其他引用,也需一並帶上。