這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
注意事項
本部落格隸屬於 goconvey - 課時 1:優雅的單元測試 請注意配套使用。
本博文為 goconvey - Go 語言單元測試包的配套部落格,旨在通過文字結合程式碼範例對該庫的使用方法和案例進行講解,便於各位同學更好地使用和深入瞭解。
庫簡介
Go 語言雖然內建單元測試功能,在 GoConvey 誕生之前也出現了許多第三方輔助庫。但沒有一個輔助庫能夠像 GoConvey 這樣優雅地書寫代碼的單元測試,簡潔的文法和舒適的介面能夠讓一個不愛書寫單元測試的開發人員從此愛上單元測試。
下載安裝
您可以通過以下兩種方式下載安裝 GoConvey:
gopm get github.com/smartystreets/goconvey
或
go get github.com/smartystreets/goconvey
API 文檔
請移步 Go Walker。
基本使用方法
範例程式碼
書寫代碼
下面是一個能夠實現整數基本四則運算(加、減、乘、除)的代碼:
package goconveyimport ( "errors")func Add(a, b int) int { return a + b}func Subtract(a, b int) int { return a - b}func Multiply(a, b int) int { return a * b}func Division(a, b int) (int, error) { if b == 0 { return 0, errors.New("被除數不能為 0") } return a / b, nil}
在上面的代碼中,我們實現了 4 個函數,因此需要為這 4 個函數分別書寫單元測試:
package goconveyimport ( "testing" . "github.com/smartystreets/goconvey/convey")func TestAdd(t *testing.T) { Convey("將兩數相加", t, func() { So(Add(1, 2), ShouldEqual, 3) })}func TestSubtract(t *testing.T) { Convey("將兩數相減", t, func() { So(Subtract(1, 2), ShouldEqual, -1) })}func TestMultiply(t *testing.T) { Convey("將兩數相乘", t, func() { So(Multiply(3, 2), ShouldEqual, 6) })}func TestDivision(t *testing.T) { Convey("將兩數相除", t, func() { Convey("除以非 0 數", func() { num, err := Division(10, 2) So(err, ShouldBeNil) So(num, ShouldEqual, 5) }) Convey("除以 0", func() { _, err := Division(10, 0) So(err, ShouldNotBeNil) }) })}
首先,您需要使用官方推薦的方式匯入 GoConvey 的輔助包以減少冗餘的代碼:. "github.com/smartystreets/goconvey/convey"
。
每個單元測試的名稱需要以 Test
開頭,例如:TestAdd
,並需要接受一個類型為 *testing.T
的參數。
使用 GoConvey 書寫單元測試,每個測試案例需要使用 Convey
函數包裹起來。它接受的第一個參數為 string 類型的描述;第二個參數一般為 *testing.T
,即本例中的變數 t;第三個參數為不接收任何參數也不返回任何值的函數(習慣以閉包的形式書寫)。
Convey
語句同樣可以無限嵌套,以體現各個測試案例之間的關係,例如 TestDivision
函數就採用了嵌套的方式體現它們之間的關係。需要注意的是,只有最外層的 Convey
需要傳入變數 t,內層的嵌套均不需要傳入。
最後,需要使用 So
語句來對條件進行判斷。在本例中,我們只使用了 3 個不同類型的條件判斷:ShouldBeNil
、ShouldEqual
和 ShouldNotBeNil
,分別表示值應該為 nil、值應該相等和值不應該為 nil。有關詳細的條件列表,可以參見 官方文檔。
運行測試
現在,您可以開啟命令列,然後輸入 go test -v
來進行測試。由於 GoConvey 相容 Go 原生的單元測試,因此我們可以直接使用 Go 的命令來執行測試。
以下便是命令列的輸出(Mac):
=== RUN TestAdd 將兩數相加 1 assertion thus far--- PASS: TestAdd (0.00 seconds)=== RUN TestSubtract 將兩數相減 2 assertions thus far--- PASS: TestSubtract (0.00 seconds)=== RUN TestMultiply 將兩數相乘 3 assertions thus far--- PASS: TestMultiply (0.00 seconds)=== RUN TestDivision 將兩數相除 除以非 0 數 除以 0 6 assertions thus far--- PASS: TestDivision (0.00 seconds)PASSok github.com/Unknwon/go-rock-libraries-showcases/lectures/03-goconvey/class1/sample/goconvey 0.009s
我們可以看到,輸出結果調理非常清晰,單元測試的代碼寫起來也非常優雅。那麼,這就是全部嗎?當然不是。GoConvey 不僅支援在命令列進行人工調用調試命令,還有非常舒適的 Web 介面提供給開發人員來進行自動化的編譯測試工作。
Web 介面
想要使用 GoConvey 的 Web 介面特性,需要在相應目錄下執行 goconvey
(需使用 go get
安裝到 $GOPATH/bin
目錄下),然後開啟瀏覽器,訪問 http://localhost:8080 ,就可以看到下以下介面:
在 Web 介面中,您可以設定介面主題,查看完整的測試結果,使用瀏覽器提醒等實用功能。
其它功能:
- 自動檢測代碼變動並編譯測試
- 半自動化書寫測試案例:http://localhost:8080/composer.html
- 查看測試覆蓋率:http://localhost:8080/reports/
- 臨時屏蔽某個包的編譯測試
小結
到這裡,大家應該對如何使用 GoConvey 包來書寫測試案例有了基本的瞭解,並且也見識到了它是如何讓書寫測試案例這項枯燥的工作變得優雅,並讓人充滿樂趣。
使用 GoConvey 編寫測試案例的包
以下包採用 GoConvey 書寫測試案例,可便於大家在執行個體中學習: