[Golang] GoConvey测试框架使用指南
GoConvey
是一款針對Golang的測試框架,可以管理和運(yùn)行測試用例,同時提供了豐富的斷言函數(shù),并支持很多 Web 界面特性。
GoConvey 網(wǎng)站 :?http://smartystreets.github.io/goconvey/
GoConvey 是個相當(dāng)不錯的 Go 測試工具,支持 go test。可直接在終端窗口和瀏覽器上使用。
特點(diǎn):
- 直接與 go test 集成
- 巨大的回歸測試套件
- 可讀性強(qiáng)的色彩控制臺輸出
- 完全自動化的 Web UI
- 測試代碼生成器
- 桌面提醒(可選)
- 自動在終端中運(yùn)行自動測試腳本
- 可立即在?Sublime Text?中打開測試問題對應(yīng)的代碼行 (some assembly required)
安裝
在命令行運(yùn)行下面的命令:
go get github.com/smartystreets/goconvey運(yùn)行時間較長,運(yùn)行完后你會發(fā)現(xiàn):
下面是一個能夠?qū)崿F(xiàn)整數(shù)基本四則運(yùn)算(加、減、乘、除)的代碼:
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("被除數(shù)不能為 0")}return a / b, nil }上面的代碼中,我們實(shí)現(xiàn)了 4 個函數(shù),因此需要為這 4 個函數(shù)分別書寫單元測試:
package goconveyimport ("testing". "github.com/smartystreets/goconvey/convey" )func TestAdd(t *testing.T) {Convey("將兩數(shù)相加", t, func() {So(Add(1, 2), ShouldEqual, 3)}) }func TestSubtract(t *testing.T) {Convey("將兩數(shù)相減", t, func() {So(Subtract(1, 2), ShouldEqual, -1)}) }func TestMultiply(t *testing.T) {Convey("將兩數(shù)相乘", t, func() {So(Multiply(3, 2), ShouldEqual, 6)}) }func TestDivision(t *testing.T) {Convey("將兩數(shù)相除", t, func() {Convey("除以非 0 數(shù)", func() {num, err := Division(10, 2)So(err, ShouldBeNil)So(num, ShouldEqual, 5)})Convey("除以 0", func() {_, err := Division(10, 0)So(err, ShouldNotBeNil)})}) }首先,您需要使用官方推薦的方式導(dǎo)入 GoConvey 的輔助包以減少冗余的代碼:. "github.com/smartystreets/goconvey/convey"。
每個單元測試的名稱需要以?Test?開頭,例如:TestAdd,并需要接受一個類型為?*testing.T?的參數(shù)。
使用 GoConvey 書寫單元測試,每個測試用例需要使用?Convey?函數(shù)包裹起來。它接受的第一個參數(shù)為 string 類型的描述;第二個參數(shù)一般為?*testing.T,即本例中的變量 t;第三個參數(shù)為不接收任何參數(shù)也不返回任何值的函數(shù)(習(xí)慣以閉包的形式書寫)。
Convey?語句同樣可以無限嵌套,以體現(xiàn)各個測試用例之間的關(guān)系,例如?TestDivision?函數(shù)就采用了嵌套的方式體現(xiàn)它們之間的關(guān)系。需要注意的是,只有最外層的?Convey?需要傳入變量 t,內(nèi)層的嵌套均不需要傳入。
最后,需要使用?So?語句來對條件進(jìn)行判斷。在本例中,我們只使用了 3 個不同類型的條件判斷:ShouldBeNil、ShouldEqual?和?ShouldNotBeNil,分別表示值應(yīng)該為 nil、值應(yīng)該相等和值不應(yīng)該為 nil。有關(guān)詳細(xì)的條件列表,可以參見?官方文檔。
運(yùn)行測試
現(xiàn)在,您可以打開命令行,然后輸入?go test -v?來進(jìn)行測試。由于 GoConvey 兼容 Go 原生的單元測試,因此我們可以直接使用 Go 的命令來執(zhí)行測試。
以下便是命令行的輸出(Mac):
=== RUN TestAdd將兩數(shù)相加 ?1 assertion thus far--- PASS: TestAdd (0.00 seconds) === RUN TestSubtract將兩數(shù)相減 ?2 assertions thus far--- PASS: TestSubtract (0.00 seconds) === RUN TestMultiply將兩數(shù)相乘 ?3 assertions thus far--- PASS: TestMultiply (0.00 seconds) === RUN TestDivision將兩數(shù)相除除以非 0 數(shù) ??除以 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我們可以看到,輸出結(jié)果調(diào)理非常清晰,單元測試的代碼寫起來也非常優(yōu)雅。那么,這就是全部嗎?當(dāng)然不是。GoConvey 不僅支持在命令行進(jìn)行人工調(diào)用調(diào)試命令,還有非常舒適的 Web 界面提供給開發(fā)者來進(jìn)行自動化的編譯測試工作。
Skip
針對想忽略但又不想刪掉或注釋掉某些斷言操作,GoConvey提供了Convey/So的Skip方法:
- SkipConvey函數(shù)表明相應(yīng)的閉包函數(shù)將不被執(zhí)行
- SkipSo函數(shù)表明相應(yīng)的斷言將不被執(zhí)行
當(dāng)存在SkipConvey或SkipSo時,測試日志中會顯式打上"skipped"形式的標(biāo)記:
- 當(dāng)測試代碼中存在SkipConvey時,相應(yīng)閉包函數(shù)中不管是否為SkipSo,都將被忽略,測試日志中對應(yīng)的符號僅為一個"?"
- 當(dāng)測試代碼Convey語句中存在SkipSo時,測試日志中每個So對應(yīng)一個"?"或"?",每個SkipSo對應(yīng)一個"?",按實(shí)際順序排列
- 不管存在SkipConvey還是SkipSo時,測試日志中都有字符串"{n} total assertions (one or more sections skipped)",其中{n}表示測試中實(shí)際已運(yùn)行的斷言語句數(shù)
Web 界面
想要使用 GoConvey 的 Web 界面特性,需要在相應(yīng)目錄下執(zhí)行?goconvey(需使用?go get?安裝到?$GOPATH/bin?目錄下),然后打開瀏覽器,訪問?http://localhost:8080?,就可以看到下以下界面:
在 Web 界面中,您可以設(shè)置界面主題,查看完整的測試結(jié)果,使用瀏覽器提醒等實(shí)用功能。
其它功能:
- 自動檢測代碼變動并編譯測試
- 半自動化書寫測試用例:http://localhost:8080/composer.html
- 查看測試覆蓋率:http://localhost:8080/reports/
- 臨時屏蔽某個包的編譯測試
小結(jié)
到這里,大家應(yīng)該對如何使用 GoConvey 包來書寫測試用例有了基本的了解,并且也見識到了它是如何讓書寫測試用例這項枯燥的工作變得優(yōu)雅,并讓人充滿樂趣。
如果在被測函數(shù)中調(diào)用了其他函數(shù),可以使用以下方法
參考:
https://www.jianshu.com/p/e3b2b1194830
https://studygolang.com/articles/1513
總結(jié)
以上是生活随笔為你收集整理的[Golang] GoConvey测试框架使用指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kakaotalk账号注册教程(disc
- 下一篇: Deep Reinforcement L