[Golang] GoConvey 測試框架使用指南
GoConvey
是一款針對 Golang 的測試框架,可以管理和運行測試用例,同時提供了豐富的斷言函數,並支持很多 Web 界面特性。
GoConvey 網站 : http://smartystreets.github.io/goconvey/
GoConvey 是個相當不錯的 Go 測試工具,支持 go test。可直接在終端窗口和瀏覽器上使用。
特點:
- 直接與 go test 集成
- 巨大的迴歸測試套件
- 可讀性強的色彩控制檯輸出
- 完全自動化的 Web UI
- 測試代碼生成器
- 桌面提醒(可選)
- 自動在終端中運行自動測試腳本
- 可立即在 Sublime Text 中打開測試問題對應的代碼行 (some assembly required)
下面是一個能夠實現整數基本四則運算(加、減、乘、除)的代碼:
package goconvey
import (
"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 goconvey
import (
"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)
PASS
ok github.com/Unknwon/go-rock-libraries-showcases/lectures/03-goconvey/class1/sample/goconvey 0.009s
我們可以看到,輸出結果調理非常清晰,單元測試的代碼寫起來也非常優雅。那麼,這就是全部嗎?當然不是。GoConvey 不僅支持在命令行進行人工調用調試命令,還有非常舒適的 Web 界面提供給開發者來進行自動化的編譯測試工作。
Skip
針對想忽略但又不想刪掉或註釋掉某些斷言操作,GoConvey 提供了 Convey/So 的 Skip 方法:
- SkipConvey 函數表明相應的閉包函數將不被執行
- SkipSo 函數表明相應的斷言將不被執行
當存在 SkipConvey 或 SkipSo 時,測試日誌中會顯式打上 "skipped" 形式的標記:
- 當測試代碼中存在 SkipConvey 時,相應閉包函數中不管是否爲 SkipSo,都將被忽略,測試日誌中對應的符號僅爲一個 "⚠"
- 當測試代碼 Convey 語句中存在 SkipSo 時,測試日誌中每個 So 對應一個 "✔" 或 "✘",每個 SkipSo 對應一個 "⚠",按實際順序排列
- 不管存在 SkipConvey 還是 SkipSo 時,測試日誌中都有字符串 "{n} total assertions (one or more sections skipped)",其中 {n} 表示測試中實際已運行的斷言語句數
Web 界面
想要使用 GoConvey 的 Web 界面特性,需要在相應目錄下執行 goconvey
(需使用 go get
安裝到 $GOPATH/bin
目錄下),然後打開瀏覽器,訪問 http://localhost:8080 ,就可以看到下以下界面:
在 Web 界面中,您可以設置界面主題,查看完整的測試結果,使用瀏覽器提醒等實用功能。
其它功能:
- 自動檢測代碼變動並編譯測試
- 半自動化書寫測試用例:http://localhost:8080/composer.html
- 查看測試覆蓋率:http://localhost:8080/reports/
- 臨時屏蔽某個包的編譯測試
小結
到這裏,大家應該對如何使用 GoConvey 包來書寫測試用例有了基本的瞭解,並且也見識到了它是如何讓書寫測試用例這項枯燥的工作變得優雅,並讓人充滿樂趣。
- import goconvey 包時,前面加點號 ".",以減少冗餘的代碼
- 測試函數的名字必須以 Test 開頭,而且參數類型必須爲 * testing.T
- 每個測試用例必須使用 Convey 函數包裹起來,推薦使用 Convey 語句的嵌套,即一個函數有一個測試函數,測試函數中嵌套兩級 Convey 語句,第一級 Convey 語句對應測試函數,第二級 Convey 語句對應測試用例
- Convey 語句的第三個參數習慣以閉包的形式實現,在閉包中通過 So 語句完成斷言
- 使用 GoConvey 框架的 Web 界面特性,作爲命令行的補充
- 在適當的場景下使用 SkipConvey 函數或 SkipSo 函數
- 當測試中有需要時,可以定製斷言函數
如果在被測函數中調用了其他函數,可以使用以下方法
參考:
https://www.jianshu.com/p/e3b2b1194830
https://studygolang.com/articles/1513
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://www.cnblogs.com/WayneZeng/p/9290711.html