安装:
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("被除数不能为0")
}
return a / b, nil
}
下面为这 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 TestSub(t *testing.T) {
Convey("将两数相减", t, func() {
So(Sub(1, 2), ShouldEqual, -1)
})
}
func TestMultiply(t *testing.T) {
Convey("将两数相减乘", t, func() {
So(Multiply(1, 2), ShouldEqual, 2)
})
}
func TestDivision(t *testing.T) {
Convey("将两数相除", t, func() {
Convey("被除数为0", func() {
_, err := Division(10, 0)
So(err, ShouldNotBeNil)
})
Convey("被除数不为0", func() {
num, err := Division(10, 2)
So(num, ShouldEqual, 5)
So(err, ShouldBeNil)
})
})
}
每个单元测试的名称需要以 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 的命令来执行测试。
$ go test -v
=== RUN TestAdd
将两数相加 ✔
1 total assertion
--- PASS: TestAdd (0.00s)
=== RUN TestSub
将两数相减 ✔
2 total assertions
--- PASS: TestSub (0.00s)
=== RUN TestMultiply
将两数相减乘 ✔
3 total assertions
--- PASS: TestMultiply (0.00s)
=== RUN TestDivision
将两数相除
被除数为0 ✔
被除数不为0 ✔✔
6 total assertions
--- PASS: TestDivision (0.00s)
PASS
ok gotest 0.012s
我们可以看到,输出结果调理非常清晰,单元测试的代码写起来也非常优雅。那么,这就是全部吗?当然不是。GoConvey 还有非常舒适的 Web 界面提供给开发者来进行自动化的编译测试工作。
Web 界面
想要使用 GoConvey 的 Web 界面特性,需要在相应目录下执行 goconvey
,然后打开浏览器,访问 http://localhost:8080 ,就可以看到下以下界面: