golang基础-单元测试与mock


本文摘自网络,作者,侵删。

golang 单元测试

单元测试介绍

为了保证代码的质量,很多公司都会要求写单元测试。这里介绍两个指标,

  1. 函数覆盖率:函数调用个数/函数个数,通常要求100%
  2. 行覆盖率:走到的行的个数/总函数,通常要求>60%

通过单元测试,我们可以针对不同场景进行测试,是研发自己对质量的把控。 笔者目前所在的公司对单元测试要求很高,并且有替代测试的趋势。

go test

  • go的test一般以xxx_test.go为文件名,xxx并没有特别要求是要实测的文件名
  • TestMain作为初始化test
  • Testxxx(t* testing.T)
  • go test 即可运行单元测试
  • go test --v --test.run funcName 可以指定单测某个方法

创建一个client包进行示例,包结构如下

. ├── client.go ├── client_test.go 复制代码
func TestUser(t *testing.T) {     var u = &User{Age: 15, Name: "alice"}     if u.Age != 15 {         t.Error("age err")     }        if u.Name != "bob" {         t.Error("name err")     }    } 复制代码

由于Name不符合预期,则会有如下提示

--- FAIL: TestUser (0.00s)     client_test.go:28: name err FAIL exit status 1 FAIL test/mocktest 0.005s 复制代码

go convey

goconvey可以很好的支持setup和teardown,goconvey可以在运行单个测试用例前都进行一次状态初始化和销毁。goconvey还有很多已经定义好了的能够直接使用的assert函数,并且可以自定义assert函数。 常用的assert如下:

var (     ShouldEqual          = assertions.ShouldEqual     ShouldNotEqual       = assertions.ShouldNotEqual     ShouldBeGreaterThan          = assertions.ShouldBeGreaterThan     ShouldBeGreaterThanOrEqualTo = assertions.ShouldBeGreaterThanOrEqualTo     ShouldBeLessThan             = assertions.ShouldBeLessThan     ShouldBeLessThanOrEqualTo    = assertions.ShouldBeLessThanOrEqualTo     ShouldBeBetween              = assertions.ShouldBeBetween     ShouldNotBeBetween           = assertions.ShouldNotBeBetween     ShouldBeBetweenOrEqual       = assertions.ShouldBeBetweenOrEqual     ShouldNotBeBetweenOrEqual    = assertions.ShouldNotBeBetweenOrEqual     ShouldContainSubstring    = assertions.ShouldContainSubstring     ShouldNotContainSubstring = assertions.ShouldNotContainSubstring     ShouldPanic        = assertions.ShouldPanic     ShouldBeError      = assertions.ShouldBeError ) 复制代码

使用举例:

func TestUser(t *testing.T) {     convey.Convey("TestUser", t, func() {         var u = &User{Age: 15, Name: "alice"}         convey.So(u.Age, convey.ShouldEqual, 15)          convey.So(u.Name, convey.ShouldEqual, "bob")     })   } 复制代码

由于Name不符合预期,会出现如下提示

  Line 30:   Expected: 'bob'   Actual:   'alice'   (Should be equal) 复制代码

mock

什么是mock

单元测试的时候,如果流程中有第三方依赖怎么办?比如当贷款支付的时候,需要用户的额度,而额度信息存在于另一个微服务,需要rpc拉取。为了解决这种场景,我们可以使用mock这种方式。简单来说,mock就是能指定依赖接口的输入 输出,可以理解为提前插入的固定数据,如此,流程就能正常跑起来。

使用mockery进行mock

限制:

  • 只能针对接口进行mock

使用流程

  • 安装mockery:go get github.com/vektra/mockery/.../
  • mockery -name=接口名,生成mocks目录。

rpc接口定义,接口实现

阅读剩余部分

相关阅读 >>

n皇后问题(Go版本)

[concurrent-map]-并发map在Go中的使用

你知道Go程序的基本要素吗

"b = &boy{}" vs "*b = boy{}" 谁不讲武德?Golang 逃逸分析入门

聊聊dubbo-Go-proxy的replacepathfilter

Golang如何处理输入?

Go 大数据生态迎来重要产品 cds

Golang中main中panic和后续panic处理,以及新开协程的影响

Gorm 如果使用同一个sql.db 去开协程。为什么速度会比单线程跑快很多

Golang 什么时候用锁

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...