goconvey:优雅的单元测试

官方网址

安装:
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 个不同类型的条件判断:ShouldBeNilShouldEqualShouldNotBeNil,分别表示值应该为 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 ,就可以看到下以下界面:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 序言 在软件开发中,产品代码的正确性通过测试代码来保证,而测试代码的正确性谁来保证?答案是毫无争议的,肯定是程序员...
    _张晓龙_阅读 53,734评论 7 67
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,526评论 0 5
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,996评论 0 38
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,165评论 1 32
  • Wings-让单元测试智能全自动生成 前言 单元测试是保证软件质量非常有效的手段,无论是从测试理论早期介入测试的理...
    星云测试阅读 676评论 0 0