Go命令教程 8 go test

2022-09-15 05:18:08 字數 3274 閱讀 7765

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 命令的標記說明

標記名稱

標記描述

-c生成用於執行測試的可執行檔案,但不執行它。這個可執行檔案會被命名為「pkg.test」,其中的「pkg」即為被測試**包的匯入路徑的最後乙個元素的名稱。

-i安裝/重新安裝執行測試所需的依賴包,但不編譯和執行測試**。

-o指定用於執行測試的可執行檔案的名稱。追加該標記不會影響測試**的執行,除非同時追加了標記 -c 或 -i。

上述這幾個標記可以搭配使用。搭配使用的目的可以是讓 go test 命令既安裝依賴包又編譯測試**,但不執行測試。也就是說,讓命令程式跑一遍執行測試之前的所有流程。這可以測試一下測試過程。注意,在加入 -c

標記後,命令程式會把用於執行測試的可執行檔案存放到當前目錄下。

除此之外,go test 命令還有很多功效各異的標記。但是由於這些標記的複雜性,我們需要結合測試原始碼檔案進行詳細的講解。所以我們在這裡略過不講。

摘自:

6g執行和8g執行有什麼差別

從理論上來說的話,6g執行記憶體的手機要比8g執行記憶體的手機要差的。一方面是8g的手機快取要更大一些,軟體應用的開啟速度要更快一些 一方面是8g手機在開啟多個軟體應用的時候,也不會出現卡頓,起碼要比6g的手機表現得要更好一些。手機哪一款值得購買?懂手機的人這樣選 而更大的運存對於多工處理顯然是乙個...

70G記憶體的手機,比8G記憶體的電腦快嗎?

平頭哥的文章 知乎 地鐵上聽到一段小白對話 女 這個70g的手機應該夠用了吧?男 6 64的那個?女 對,就是那個70g的,這個記憶體是我本本上記憶體的很多倍,應該夠用了吧。男 呃.這個不能加起來的,不是這樣算的。女 為什麼不能加,你過來看,人家上面就是這麼寫的。男 嗯,好吧,70g夠用了。手機記憶...

8G無鎖iPhone 3GS到村 報價4300元

據中關村水貨商透露,最為蘋果最後一款3gs,水貨英國8g無鎖版iphone 3gs已少量到達,4300元。據了解,在蘋果iphone 4上市後的第二週,iphone 3gs原有的16gb 32gb iphone 3g 8gb宣告停產,iphone 3gs 8gb成為新的替代產品上市,美國合2年約版售...