单元测试中的打桩技术:mock浅谈

背景

测试从下到上大致可以分为单元测试、端到端测试和系统集成测试。

单元测试是最基础的,一般其代码量也是最多的,一般是针对函数、方法和类的测试,但其写好后改动一般是最小的,单元测试是其他测试的基石。
端到端测试是基于单元测试之上的,主要针对API和接口的测试,由于只针对接口进行测试,相对单元测试,端到端测试代码量更少,但面对需求的变更其测试代码也更容易变更。
系统集成测试主要是对整个系统进行测试,针对地是客户端的使用界面。

以现在主流的前后端分离来说明:

单元测试 端到端测试 系统集成测试
针对视图层中的某个视图方法的测试,或者针对模型层中某个orm的测试 模拟接口请求进行测试 模拟用户操作进行测试

介绍完测试的类型,下面主要介绍下单元测试中的mock技术。
mock是一种用于单元测试数据模拟的技术,俗称打桩技术。
mock的好处:
1、并行工作:借助mock,接口之间可以实现解耦合,实现测试驱动开发
2、隔离系统:可以模拟请求,避免数据库的污染,同时可以做界面演示

Go 语言中的 mock

Go中mock可以使用官方的GoMock包,以本人的https://github.com/shikanon/socks5proxy项目为例,来介绍 mock 在 Go 的单元测试中的使用。

mock 安装

1
2
3
go get -u github.com/golang/mock/gomock

go install github.com/golang/mock/mockgen

mockgen 生成 mock 文件

Go 提供了 mockgen 工具,用来生成:

1
mockgen -source=socks5.go -destination=./mock/socks5_mock.go -package=mock

mockgen是根据接口发射的方式生成mock,所以source里面必须要有interface。
当然,也可以直接在注释前加入注释再借助 go generate 来生成,如:

1
2
3
4
5
//go:generate mockgen -source=socks5.go -destination=./mock/socks5_mock.go -package=mock
type Protocol interface {
HandleHandshake(b []byte) ([]byte, error)
SentHandshake(conn net.Conn) error
}

在项目目录下运行:

1
go generate

1
2
3
4
5
6
7
8
9
func (c *Call) After(preReq *Call) *Call
func (c *Call) AnyTimes() *Call
func (c *Call) Do(f interface{}) *Call
func (c *Call) MaxTimes(n int) *Call
func (c *Call) MinTimes(n int) *Call
func (c *Call) Return(rets ...interface{}) *Call
func (c *Call) SetArg(n int, value interface{}) *Call
func (c *Call) String() string
func (c *Call) Times(n int) *Call

Python 语言中的 mock

shikanon wechat
欢迎您扫一扫,订阅我滴↑↑↑的微信公众号!