zoukankan      html  css  js  c++  java
  • 【转】goconvey使用

     

    ------------------------

    GoConvey

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

    GoConvey 网站 : http://smartystreets.github.io/goconvey/

    GoConvey 是个相当不错的 Go 测试工具,支持 go test。可直接在终端窗口和浏览器上使用。

    特点:

    • 直接与 go test 集成
    • 巨大的回归测试套件
    • 可读性强的色彩控制台输出
    • 完全自动化的 Web UI
    • 测试代码生成器
    • 桌面提醒(可选)
    • 自动在终端中运行自动测试脚本
    • 可立即在 Sublime Text 中打开测试问题对应的代码行 (some assembly required)

    安装

    在命令行运行下面的命令:

    go get github.com/smartystreets/goconvey
    

    运行时间较长,运行完后你会发现:

    1. 在$GOPATH/src目录下新增了github.com子目录,该子目录里包含了GoConvey框架的库代码
    2. 在$GOPATH/bin目录下新增了GoConvey框架的可执行程序goconvey

    下面是一个能够实现整数基本四则运算(加、减、乘、除)的代码:

    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)
            })
        })
    }
    

    首先,您需要使用官方推荐的方式导入 GoConvey 的辅助包以减少冗余的代码:. "github.com/smartystreets/goconvey/convey"

    每个单元测试的名称需要以 Test 开头,例如:TestAdd,并需要接受一个类型为 *testing.T 的参数。

    使用 GoConvey 书写单元测试,每个测试用例需要使用 Convey 函数包裹起来。它接受的第一个参数为 string 类型的描述;第二个参数一般为 *testing.T,即本例中的变量 t;第三个参数为不接收任何参数也不返回任何值的函数(习惯以闭包的形式书写)。

    Convey 语句同样可以无限嵌套,以体现各个测试用例之间的关系,例如 TestDivision 函数就采用了嵌套的方式体现它们之间的关系。需要注意的是,只有最外层的 Convey 需要传入变量 t,内层的嵌套均不需要传入。

    最后,需要使用 So 语句来对条件进行判断。在本例中,我们只使用了 3 个不同类型的条件判断:ShouldBeNilShouldEqual 和 ShouldNotBeNil,分别表示值应该为 nil、值应该相等和值不应该为 nil。有关详细的条件列表,可以参见 官方文档

    运行测试

    现在,您可以打开命令行,然后输入 go test -v 来进行测试。由于 GoConvey 兼容 Go 原生的单元测试,因此我们可以直接使用 Go 的命令来执行测试。

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

     

    Skip

    针对想忽略但又不想删掉或注释掉某些断言操作,GoConvey提供了Convey/So的Skip方法:

    • SkipConvey函数表明相应的闭包函数将不被执行
    • SkipSo函数表明相应的断言将不被执行

    当存在SkipConvey或SkipSo时,测试日志中会显式打上"skipped"形式的标记:

    • 当测试代码中存在SkipConvey时,相应闭包函数中不管是否为SkipSo,都将被忽略,测试日志中对应的符号仅为一个"⚠"
    • 当测试代码Convey语句中存在SkipSo时,测试日志中每个So对应一个"✔"或"✘",每个SkipSo对应一个"⚠",按实际顺序排列
    • 不管存在SkipConvey还是SkipSo时,测试日志中都有字符串"{n} total assertions (one or more sections skipped)",其中{n}表示测试中实际已运行的断言语句数

    Web 界面

    想要使用 GoConvey 的 Web 界面特性,需要在相应目录下执行 goconvey(需使用 go get 安装到 $GOPATH/bin 目录下),然后打开浏览器,访问 http://localhost:8080 ,就可以看到下以下界面:

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

    其它功能:

    小结

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

    1. import goconvey包时,前面加点号".",以减少冗余的代码
    2. 测试函数的名字必须以Test开头,而且参数类型必须为*testing.T
    3. 每个测试用例必须使用Convey函数包裹起来,推荐使用Convey语句的嵌套,即一个函数有一个测试函数,测试函数中嵌套两级Convey语句,第一级Convey语句对应测试函数,第二级Convey语句对应测试用例
    4. Convey语句的第三个参数习惯以闭包的形式实现,在闭包中通过So语句完成断言
    5. 使用GoConvey框架的 Web 界面特性,作为命令行的补充
    6. 在适当的场景下使用SkipConvey函数或SkipSo函数
    7. 当测试中有需要时,可以定制断言函数

    如果在被测函数中调用了其他函数,可以使用以下方法




    参考:
    https://www.jianshu.com/p/e3b2b1194830
    https://studygolang.com/articles/1513
  • 相关阅读:
    基于vue-cli配置移动端自适应项目
    webpack 之 resolve.alias(别名)
    vue 之引用全局样式
    webpack 3.0
    vue 之 data为什么必须声明为返回一个初始数据对象的函数?
    JS柯里化
    《css设计指南》 读书笔记 二
    《css设计指南》 读书笔记 一
    简单的移动端图片预览 包含放大缩小以及对各种手势的判定
    图片拍照上传 使用fileReader 无需跨域
  • 原文地址:https://www.cnblogs.com/oxspirt/p/14505148.html
Copyright © 2011-2022 走看看