我的编程空间,编程开发者的网络收藏夹
学习永远不晚

golang 打桩,mock数据怎么玩?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

golang 打桩,mock数据怎么玩?

工作中,很多公司都要求效能,要求自动化测试

实际落地的过程中发现,要做单元测试,自动化测试,可能当前这个服务会依赖其他服务的数据,接口等等

那么单测或者自动化的过程中,就可能会由于其他服务的原因或者环境因素导致测试失败,或者阻塞测试

这是一个问题,必须得解决,我们可以采用 golang 自带的 mock 工具来完成,可以在一些必要的地方进行数据打桩,mock 数据

gomock 是什么?

是官方提供的 一个 mock 数据的 框架

官方还提供了 mockgen 工具用来帮助 我们 生成测试代码

github 上项目地址是:github.com/golang/mock

官方是这样介绍 gomock 的:

gomock 是一个用于Go 编程语言的 mocking 框架。它与 Go 的内置测试包集成得很好,但也可以在其他环境中使用。

如何使用 gomock?

使用 gomock 也是非常简单的,先 go get 对应的 工具  gomock  和  mockgen

go get -u github.com/golang/mock/gomock
go get -u github.com/golang/mock/mockgen

可以写一个 demo 来进行实践

目录结构是这样的

gomock_test
├── go.mod
├── go.sum
├── main.go
└── myfunc
    ├── mock_myfunc.go
    ├── myfunc.go
    ├── myuser.go
    └── myuser_test.go

  • mock_myfunc.go 是使用 mockgen 工具生成的

  • myfunc.go 主要是用于模拟调用的底层实现

  • myuser.go 主要是去调用  myfunc.go 里面的接口

  • myuser_test.go 是 对应的单测文件

myfunc.go

  • 编写一个 接口,里面有一个 GetInfo() string 方法,模拟获取信息

package myfunctype MyFunc interface {    GetInfo() string}

myuser.go

  • 调用 myfunc.go 中的方法,调用接口获取信息

package myfuncfunc getUser(m MyFunc) string {
    user := m.GetInfo()    return user}

mock 文件的生成

mock_myfunc.go

这个文件不是我们自己写的,是通过 mockgen 工具生成的 ,生成方式如下:

在 myfunc.go 的同级目录下执行如下语句,填入 source 源文件 和 目标文件即可生成新的 mock 文件

mockgen -source=myfunc.go -destination=mock_myfunc.go

我们可以看一下 mockgen 的帮助文档,还有其他的参数供我们使用

# mockgenmockgen has two modes of operation: source and reflect.

Source mode generates mock interfaces from a source file.
It is enabled by using the -source flag. Other flags that
may be useful in this mode are -imports and -aux_files.
Example:
        mockgen -source=foo.go [other options]Reflect mode generates mock interfaces by building a program
that uses reflection to understand interfaces. It is enabled
by passing two non-flag arguments: an import path, and a
comma-separated list of symbols.
Example:
        mockgen database/sql/driver Conn,Driver

  -aux_files string        (source mode) Comma-separated pkg=path pairs of auxiliary Go source files.
  -build_flags string        (reflect mode) Additional flags for go build.
  -copyright_file string
        Copyright file used to add copyright header
  -debug_parser
        Print out parser results only.
  -destination string
        Output file; defaults to stdout.
  -exec_only string        (reflect mode) If set, execute this reflection program.
  -imports string        (source mode) Comma-separated name=path pairs of explicit imports to use.
  -mock_names string
        Comma-separated interfaceName=mockName pairs of explicit mock names to use. Mock names default to 'Mock'+ interfaceName suffix.
  -package string
        Package of the generated code; defaults to the package of the input with a 'mock_' prefix.
  -prog_only        (reflect mode) Only generate the reflection program; write it to stdout and exit.
  -self_package string
        The full package import path for the generated code. The purpose of this flag is to prevent import cycles in the generated code by trying to include its own package. This can happen if the mock's package is set to one of its inputs (usually the main one) and the output is stdio so mockgen cannot detect the final output package. Setting this flag will then tell mockgen which import to exclude.
  -source string        (source mode) Input Go source file; enables source mode.
  -version
        Print version.
  -write_package_comment
        Writes package documentation comment (godoc) if true. (default true)2021/10/30 16:43:25 Expected exactly two arguments

一般用的比较多的就是

  • -source 源文件

  • -destination 目标文件

  • -imports  依赖的需要 import 的包

  • -build_flags 传递给build工具的参数

  • -aux_files 接口文件不止一个文件时附加文件

  • -package 设置 mock 文件的包名,不设置的话,mock 文件的包名默认是 mock_输入文件的包名

通过上述指令生成的 mock 文件如下:

  • NewMockMyFunc

创建一个新的 mock 实例

  • EXPECT

允许调用者指示预期用途的对象

  • GetInfo

mock 的基础方法,也就是我们需要 mock 的方法

具体的如何使用

myuser_test.go

  • myuser.go 对应的单测文件 , 使用了 mock 的方式

package myfuncimport (    "fmt"    "testing"
    gomock "github.com/golang/mock/gomock")func Test_getUser(t *testing.T) {
    mockCtl := gomock.NewController(t)
    mockMyFunc := NewMockMyFunc(mockCtl)
    mockMyFunc.EXPECT().GetInfo().Return("xiaomotong")
    v := getUser(mockMyFunc)    if v == "xiaomotong" {
        fmt.Println("get user right!")    } else {
        t.Error("get error user")    }}

看到上述单测文件,可以还不是特别明白区别,我们来看看不用 mock 的时候,我们会是如何去写单测呢

package myfuncimport (    "fmt"    "testing"
    gomock "github.com/golang/mock/gomock")func Test_getUser(t *testing.T) {
    m := myfunc.CreateMyFunc() // 也就是说需要自己创建一个对象
    v := getUser(m)    if v == "xiaomotong" {
        fmt.Println("get user right!")    } else {
        t.Error("get error user")    }}

m := myfunc.CreateMyFunc() 看到上述这一句话,是创建对应的对象,再将该对象作为参数传入到  getUser 函数中,正常情况下这样做单测没有问题

但是如果这个时候创建 MyFunc 对象由于对外部还有依赖导致还没有编码好,可是也不能阻塞我们的单元测试

这个时候使用最上面的 mock 方案就显得尤为重要,可以使用 mock 的方式,mock 一个 MyFunc 对象,并设置好返回值即可完成,如:

mockCtl := gomock.NewController(t)mockMyFunc := NewMockMyFunc(mockCtl)mockMyFunc.EXPECT().GetInfo().Return("xiaomotong")

执行上述代码结果如下:

> go testget user right!PASS
ok      mygomock/myfunc 0.427s

感兴趣的朋友可以使用起来,用的多了就会更加熟悉

使用 gomock 的好处?

  • gomock  实现了较为完整的基于 interface 的 Mock 功能,能够与 Golang 内置的 testing包良好集成,也能用于其它的测试环境中

  • 学习成本低,很快就能上手

工具需要用起来,才能发挥他的价值,需要的可以用起来吧

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

golang 打桩,mock数据怎么玩?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

golang 打桩,mock数据怎么玩?

工作中,很多公司都要求效能,要求自动化测试实际落地的过程中发现,要做单元测试,自动化测试,可能当前这个服务会依赖其他服务
2023-05-17

java怎么生成mock数据

在Java中,可以使用以下几种方法生成Mock数据:使用第三方库:有许多Java的第三方库可以生成Mock数据,其中比较常用的库有Mockito、EasyMock和PowerMock等。这些库提供了丰富的API和功能,可以根据需要生成各种类
2023-10-22

Go怎么对数据库CRUD进行Mock测试

今天小编给大家分享一下Go怎么对数据库CRUD进行Mock测试的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。go-sqlmo
2023-07-02

vite+vue3中怎么使用mock模拟数据问题

1.安装mockjs和vite-plugin-mocknpmimockjsvite-plugin-mock--save-dev2.在vite.config.ts文件中配置vite-plugin-mock使用方式import{defineConfig}from'vite'importvuefrom'@vitejs/plugin-vue'import{viteMockServe}from'vite-plugin-mock
2023-05-15

vue本地模拟服务器怎么请求mock数据

本篇内容介绍了“vue本地模拟服务器怎么请求mock数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!原因1、mockjs本地开发的时候用还
2023-06-29

golang怎么遍历mysql数据库

本篇内容介绍了“golang怎么遍历mysql数据库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、连接MySQL数据库在开始遍历MySQ
2023-07-06

Golang怎么操作sqlite3数据库

这篇文章主要介绍了Golang怎么操作sqlite3数据库的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang怎么操作sqlite3数据库文章都会有所收获,下面我们一起来看看吧。sqlite概述sqlit
2023-07-06

怎么用golang编写数据库

要使用Golang编写数据库,您可以按照以下步骤进行操作:安装数据库驱动:首先,您需要安装适用于Golang的数据库驱动程序。Golang提供了各种数据库驱动程序,可以根据您使用的数据库类型进行选择。常见的数据库驱动程序有mysql, po
怎么用golang编写数据库
2024-02-29

Golang中怎么读写Channel数据

本文小编为大家详细介绍“Golang中怎么读写Channel数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang中怎么读写Channel数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Channel
2023-07-04

golang怎么连接mysql数据库

今天小编给大家分享一下golang怎么连接mysql数据库的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。golang操作my
2023-06-30

mdb数据库怎么打开

要打开mdb数据库,您需要安装Microsoft Access或者一些兼容的软件。以下是打开mdb数据库的步骤:1. 打开Microsoft Access软件。2. 点击“打开其他文件”选项。3. 在“打开”对话框中,选择mdb数据库文件。
2023-06-08

oracle怎么打开数据库

打开 oracle 数据库的步骤如下:打开 oracle 数据库客户端连接到数据库服务器:connect username/password@servername使用 sqlplus 命令打开数据库:sqlplus如何打开 Oracle 数
oracle怎么打开数据库
2024-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录