GoConvey

是一款针对Golang的测试框架,可以管理和运行测试用例,同时提供了丰富的断言函数,并支持很多 Web 界面特性。

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)
        })
    })
}
. "github.com/smartystreets/goconvey/convey"
TestTestAdd*testing.T
Convey*testing.T
ConveyTestDivisionConvey
SoShouldBeNilShouldEqualShouldNotBeNil

运行测试

go test -v

以下便是命令行的输出(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 界面提供给开发者来进行自动化的编译测试工作。


Web 界面

goconveygo get$GOPATH/bin


在 Web 界面中,您可以设置界面主题,查看完整的测试结果,使用浏览器提醒等实用功能。

其它功能:

  • 自动检测代码变动并编译测试
  • 临时屏蔽某个包的编译测试

小结

到这里,大家应该对如何使用 GoConvey 包来书写测试用例有了基本的了解,并且也见识到了它是如何让书写测试用例这项枯燥的工作变得优雅,并让人充满乐趣。