「go test」是測試指令,作用是對Go語言寫的程式進行測試;這種測試是以程式碼包為單位的。 「go test」指令會自動讀取源碼目錄下面名為「*_test.go」的內含若干測試函數的源碼文件,測試函數一般是以「Test」為名稱前綴並有一個類型為「testing.T ”的參數聲明的函數。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
Go語言擁有一套單元測試和效能測試系統,只需要添加很少的程式碼就可以快速測試一段需求程式碼。
go test 指令,會自動讀取原始碼目錄下方名為 *_test.go 的文件,產生並執行測試用的可執行檔。
go test指令(測試指令)
#go test
指令用於對Go語言編寫的程式進行測試。這種測試是以程式碼包為單位的。當然,這也需要測試原始碼檔案的幫助。關於怎樣寫好Go程式測試程式碼,我們會在本章的第二節加以詳述。在這裡,我們只討論如何使用命令啟動測試。
go test
指令會自動測試每一個指定的程式碼包。當然,前提是指定的程式碼包中存在測試原始碼檔案。測試原始碼檔案是名稱以「_test.go」為後綴的、內含若干測試函數的原始碼檔案。測試函數一般是以「Test」為名稱前綴並有一個類型為「testing.T」的參數宣告的函數.
現在,我們來測試goc2p專案中的幾個程式碼包。在使用go test
指令時指定程式碼包的方式與其他指令無異-使用程式碼包匯入路徑。如果需要測試多個程式碼包,則需要在它們的匯入路徑之間加入空格以示分隔。範例如下:
hc@ubt:~$ go test basic cnet/ctcp pkgtool ok basic 0.012s ok cnet/ctcp 2.014s ok pkgtool 0.014s
go test
指令在執行完所有的程式碼包中的測試檔之後,會以程式碼包為單位列印測試概要資訊。在上面的範例中,對應三個程式碼包的三行資訊的第一列都是「ok」。這說明它們都通過了測試。每行的第三列顯示執行對應測試所花費的時間,以秒為單位。我們也可以在程式碼包目錄下執行不加任何參數的運行go test
命令。其作用和結果與上面的範例是一樣的。
另外,我們也可以指定測試原始碼檔案來進行測試。這樣的話,go test
命令只會執行指定檔案中的測試,像這樣:
hc@ubt:~/golang/goc2p/src/pkgtool$ go test envir_test.go # command-line-arguments ./envir_test.go:25: undefined: GetGoroot ./envir_test.go:40: undefined: GetAllGopath ./envir_test.go:81: undefined: GetSrcDirs ./envir_test.go:83: undefined: GetAllGopath ./envir_test.go:90: undefined: GetGoroot FAIL command-line-arguments [build failed]
我們看到,與指定原始碼檔案進行編譯或運行一樣,命令程式會為指定的原始碼檔案產生一個虛擬程式碼包——「command-line-arguments」。但是,測試並沒有通過。但原因並不是測試失敗,而是編譯失敗。對於執行這次測試的命令程式來說,測試原始碼檔案envir_test.go是屬於程式碼包「command-line-arguments」的。並且,這個測試原始碼檔案中使用了庫源碼檔案envir.go中的函數。但是,它卻沒有顯示匯入這個庫原始碼檔案所屬的程式碼包。這顯然會造成編譯錯誤。如果想解決這個問題,我們還需要在執行指令時加入這個測試原始碼檔案所測試的那個原始碼檔案。範例如下:
hc@ubt:~/golang/goc2p/src/pkgtool$ go test envir_test.go envir.go ok command-line-arguments 0.010s
現在,我們故意讓程式碼套件pkgtool
中的某個測試失敗。現在我們再來執行測試:
hc@ubt:~$ go test basic cnet/ctcp pkgtool ok basic 0.010s ok cnet/ctcp 2.015s --- FAIL: TestGetSrcDirs (0.00 seconds) envir_test.go:85: Error: The src dir '/usr/local/go/src/pkg' is incorrect. FAIL FAIL pkgtool 0.009s
我們透過上述範例中的摘要資訊獲知,測試原始碼檔案中envir_test.go的測試函數TestGetSrcDirs
中的測試失敗了。在包含測試失敗的測試原始碼檔案名稱的那一行訊息中,緊跟著測試原始碼檔案名稱的用冒號分隔的數字是錯誤訊息所處的行號,行號後面用冒號分隔的是錯誤訊息。這個錯誤訊息的內容是使用者自行寫的。另外,概要資訊的最後一行以「FAIL」為前綴。這表示針對程式碼包pkgtool的測試未通過。未通過的原因在前面的資訊中已有描述。
一般情況下,我們會把測試原始碼檔案與被測試的原始碼檔案放在同一個程式碼包中。並且,這些原始碼檔案中聲明的套件名稱也都是相同的。除此之外我們還有一個選擇,那就是測試原始碼檔案中宣告的套件名稱可以是所屬套件名稱再加上「_test」字尾。我們把這種測試原始碼檔案叫做包外測試原始碼檔案。不過,包外測試源碼檔案存在一個弊端,那就是在它們的測試函數中無法測試被測源碼檔案中的包級私有的程式實體,例如包級私有的變數、函數和結構體類型。這是因為這兩者的所屬代碼包是不相同的。所以,我們一般很少會寫包外測試原始碼檔。
關於標記
go test
指令的標記處理部分是龐大且繁雜的,以至於使Go語言的開發者們不得不把這一部分的邏輯從go test
命令程式主體中分離出來並建立單獨的源碼檔案。因為go test
指令中包含了編譯動作,所以它可以接受可用於go build
指令的所有標記。另外,它還有很多特有的標記。這些標記的用於控制命令本身的動作,有的用於控制和設定測試的過程和環境,還有的用於產生更詳細的測試結果和統計資料。
可用來go test
指令的幾個比較常用的標記是-c
、-i
和-o
。這兩個就是用來控制go test
指令本身的動作的標記。詳見下表。
表0-6 go test
指令的標記說明
標記名稱 | ##標記描述|
---|---|
產生用於運行測試的可執行文件,但不執行它。這個可執行檔會被命名為“pkg.test”,其中的“pkg”就是被測試程式碼包的導入路徑的最後一個元素的名稱。 | |
安裝/重新安裝執行測試所需的依賴套件,但不編譯和執行測試程式碼。 | |
指定用於執行測試的可執行檔的名稱。追加此標記不會影響測試程式碼的運行,除非同時追加了標記 | -c或 -i。
|
go test指令既安裝依賴套件又編譯測試程式碼,但不執行測試。也就是說,讓命令程式跑一遍運行測試之前的所有流程。這可以測試一下測試過程。注意,加入
-c標記後,指令程式會把用來執行測試的執行檔存放到目前目錄下。
以上是go test的作用是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!