安裝:
go get github.com/smartystreets/goconvey
基本使用方法
下面是一個基本四則運算(加荷荤、減衣盾、乘、除)的代碼:
package goconvey
import "errors"
func Add(a, b int) int {
return a + b
}
func Sub(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
}
下面為這 4 個函數(shù)分別書寫單元測試:
package goconvey
import (
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func TestAdd(t *testing.T) {
Convey("將兩數(shù)相加", t, func() {
So(Add(1, 2), ShouldEqual, 3)
})
}
func TestSub(t *testing.T) {
Convey("將兩數(shù)相減", t, func() {
So(Sub(1, 2), ShouldEqual, -1)
})
}
func TestMultiply(t *testing.T) {
Convey("將兩數(shù)相減乘", t, func() {
So(Multiply(1, 2), ShouldEqual, 2)
})
}
func TestDivision(t *testing.T) {
Convey("將兩數(shù)相除", t, func() {
Convey("被除數(shù)為0", func() {
_, err := Division(10, 0)
So(err, ShouldNotBeNil)
})
Convey("被除數(shù)不為0", func() {
num, err := Division(10, 2)
So(num, ShouldEqual, 5)
So(err, ShouldBeNil)
})
})
}
每個單元測試的名稱需要以 Test
開頭,例如:TestAdd
凛剥,并需要接受一個類型為 *testing.T
的參數(shù)。
使用 GoConvey 書寫單元測試轻姿,每個測試用例需要使用 Convey
函數(shù)包裹起來犁珠。它接受的第一個參數(shù)為 string 類型的描述;第二個參數(shù)一般為 *testing.T
踢代,即本例中的變量 t盲憎;第三個參數(shù)為不接收任何參數(shù)也不返回任何值的函數(shù)(習慣以閉包的形式書寫)。
Convey
語句同樣可以無限嵌套胳挎,以體現(xiàn)各個測試用例之間的關(guān)系饼疙,例如 TestDivision
函數(shù)就采用了嵌套的方式體現(xiàn)它們之間的關(guān)系。需要注意的是慕爬,只有最外層的 Convey
需要傳入變量 t窑眯,內(nèi)層的嵌套均不需要傳入。
最后医窿,需要使用 So
語句來對條件進行判斷磅甩。在本例中,我們只使用了 3 個不同類型的條件判斷:ShouldBeNil
姥卢、ShouldEqual
和 ShouldNotBeNil
卷要,分別表示值應(yīng)該為 nil、值應(yīng)該相等和值不應(yīng)該為 nil独榴。有關(guān)詳細的條件列表僧叉,可以參見 官方文檔。
運行測試
現(xiàn)在棺榔,您可以打開命令行瓶堕,然后輸入 go test -v
來進行測試。由于 GoConvey 兼容 Go 原生的單元測試症歇,因此我們可以直接使用 Go 的命令來執(zhí)行測試郎笆。
$ go test -v
=== RUN TestAdd
將兩數(shù)相加 ?
1 total assertion
--- PASS: TestAdd (0.00s)
=== RUN TestSub
將兩數(shù)相減 ?
2 total assertions
--- PASS: TestSub (0.00s)
=== RUN TestMultiply
將兩數(shù)相減乘 ?
3 total assertions
--- PASS: TestMultiply (0.00s)
=== RUN TestDivision
將兩數(shù)相除
被除數(shù)為0 ?
被除數(shù)不為0 ??
6 total assertions
--- PASS: TestDivision (0.00s)
PASS
ok gotest 0.012s
我們可以看到谭梗,輸出結(jié)果調(diào)理非常清晰,單元測試的代碼寫起來也非常優(yōu)雅宛蚓。那么激捏,這就是全部嗎?當然不是凄吏。GoConvey 還有非常舒適的 Web 界面提供給開發(fā)者來進行自動化的編譯測試工作缩幸。
Web 界面
想要使用 GoConvey 的 Web 界面特性,需要在相應(yīng)目錄下執(zhí)行 goconvey
竞思,然后打開瀏覽器,訪問 http://localhost:8080 钞护,就可以看到下以下界面: