[Golang] GoConvey测试框架使用指南
GoConvey
是一款針對Golang的測試框架,可以管理和運行測試用例,同時提供了豐富的斷言函數,并支持很多 Web 界面特性。
GoConvey 網站 :?http://smartystreets.github.io/goconvey/
GoConvey 是個相當不錯的 Go 測試工具,支持 go test。可直接在終端窗口和瀏覽器上使用。
特點:
- 直接與 go test 集成
- 巨大的回歸測試套件
- 可讀性強的色彩控制臺輸出
- 完全自動化的 Web UI
- 測試代碼生成器
- 桌面提醒(可選)
- 自動在終端中運行自動測試腳本
- 可立即在?Sublime Text?中打開測試問題對應的代碼行 (some assembly required)
安裝
在命令行運行下面的命令:
go get github.com/smartystreets/goconvey運行時間較長,運行完后你會發現:
下面是一個能夠實現整數基本四則運算(加、減、乘、除)的代碼:
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) 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 包來書寫測試用例有了基本的了解,并且也見識到了它是如何讓書寫測試用例這項枯燥的工作變得優雅,并讓人充滿樂趣。
如果在被測函數中調用了其他函數,可以使用以下方法
參考:
https://www.jianshu.com/p/e3b2b1194830
https://studygolang.com/articles/1513
總結
以上是生活随笔為你收集整理的[Golang] GoConvey测试框架使用指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kakaotalk账号注册教程(disc
- 下一篇: win10本地磁盘显示蓝色问号怎么解决