返回顶部
首页 > 资讯 > 后端开发 > GO >golang 打桩,mock数据怎么玩?
  • 0
分享到

golang 打桩,mock数据怎么玩?

golangmockgo教程 2023-05-17 14:05:30 0人浏览 佚名
摘要

工作中,很多公司都要求效能,要求自动化测试实际落地的过程中发现,要做单元测试,自动化测试,可能当前这个服务会依赖其他服务的数据,接口等等那么单测或者自动化的过程中,就可能会由于其他服务的原因或者环境因素导致测试失败,或者阻塞测试这是一个问题

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

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

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

这是一个问题,必须得解决,我们可以采用 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包良好集成,也能用于其它的测试环境中

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

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

您可能感兴趣的文档:

--结束END--

本文标题: golang 打桩,mock数据怎么玩?

本文链接: https://lsjlt.com/news/211173.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • golang 打桩,mock数据怎么玩?
    工作中,很多公司都要求效能,要求自动化测试实际落地的过程中发现,要做单元测试,自动化测试,可能当前这个服务会依赖其他服务的数据,接口等等那么单测或者自动化的过程中,就可能会由于其他服务的原因或者环境因素导致测试失败,或者阻塞测试这是一个问题...
    99+
    2023-05-17
    golang mock go教程
  • MAC M1芯片使用golang的mock打桩库gomonkey没有权限问题解决
    MAC M1芯片使用golang的mock打桩库gomonkey没有权限问题解决 1. 找到gomonkey库的源码文件 modify_binary_darwin.go # 找到gomonkey库所在...
    99+
    2023-09-12
    macos golang gomonkey
  • java怎么生成mock数据
    在Java中,可以使用以下几种方法生成Mock数据: 使用第三方库:有许多Java的第三方库可以生成Mock数据,其中比较常用的...
    99+
    2023-10-22
    java
  • golang怎么玩
    随着互联网的蓬勃发展,越来越多的企业和开发者开始采用新的技术来改善他们的业务和服务。其中,Golang作为一种新兴的编程语言,正受到人们的关注和喜爱。Golang是一种开源的、强类型的编程语言,也被称作Go。它是由Google开发的,是一种...
    99+
    2023-05-16
  • Golang 函数测试中的数据量Mock策略
    在 go 函数测试中处理大量数据时,可以通过以下策略使用 mock 进行模拟:1. 使用第三方库(mockery、go-mockgen、wiremocksvc);2. 使用内建接口。例如...
    99+
    2024-04-17
    单元测试 mock golang
  • 怎么查看Mock GraphQL接口数据
    本篇内容介绍了“怎么查看Mock GraphQL接口数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!//...
    99+
    2024-04-02
  • 基于matlab怎么模拟打桩机运动学
    这篇文章主要介绍“基于matlab怎么模拟打桩机运动学”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于matlab怎么模拟打桩机运动学”文章能帮助大家解决问题。1...
    99+
    2024-04-02
  • vue-cli本地开发mock数据怎么用
    这篇文章主要介绍了vue-cli本地开发mock数据怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue-cli 中可以通过配置 pr...
    99+
    2024-04-02
  • vue项目中怎么使用mock数据接口
    本篇文章为大家展示了vue项目中怎么使用mock数据接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.使用devServer.before进行数据mock//通...
    99+
    2024-04-02
  • Go怎么对数据库CRUD进行Mock测试
    今天小编给大家分享一下Go怎么对数据库CRUD进行Mock测试的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。go-sqlmo...
    99+
    2023-07-02
  • vite+vue3中怎么使用mock模拟数据问题
    1.安装mockjs和vite-plugin-mocknpm i mockjs vite-plugin-mock --save-dev2.在vite.config.ts文件中配置vite-plugin-mock使用方式import { de...
    99+
    2023-05-15
    Vue3 vite mock
  • vue本地模拟服务器怎么请求mock数据
    本篇内容介绍了“vue本地模拟服务器怎么请求mock数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!原因mockjs本地开发的时候用还好,...
    99+
    2023-06-29
  • golang怎么转换数据
    作为一种高效、简洁的编程语言,Golang在数据转换方面也非常灵活。本文将探讨Golang中的一些数据类型转换方法,以及在实际应用中的一些注意事项。一、基本数据类型转换string类型转换为int类型字符转数字,可以使用strconv包提供...
    99+
    2023-05-14
  • golang怎么并发数据
    Go语言是一种以并发编程为设计重点的语言,它具有轻量级线程(即goroutine)和可扩展的通信机制,使得其在处理并发数据时变得非常高效。本文将介绍如何使用goroutine和通道在Go中实现并发数据处理。goroutine是一种轻量级线程...
    99+
    2023-05-14
  • golang立方怎么打
    随着云计算、大数据、人工智能等技术的快速发展,程序语言的需求也越来越高。其中,Golang作为Google公司推出的一款新型程序语言,因其高效、简洁、安全等特点而备受瞩目。而其中立方的处理,也成为Golang开发中的关键问题之一。本文将介绍...
    99+
    2023-05-14
  • golang怎么操作mysql数据
    在现代软件工程中,构建高效可靠的服务器应用程序所需的技术具有很高的要求。其中,使用 Go 语言调用关系型数据库是一个不可或缺的基础。在本文中,我们将使用 Go 语言中的标准包实现对 MySQL 数据进行查询和插入操作。什么是 MySQLMy...
    99+
    2023-05-14
    Golang go语言 mysql
  • golang怎么将数据转float
    Golang 是一门现代化的编程语言,它支持多种数据类型,包括布尔类型、整数类型、浮点型等等。在 Golang 中,如果我们需要将一个数据转换为浮点型,可以使用转换函数将其转换为 float32 或 float64 类型。以 float32...
    99+
    2023-05-14
  • mdb数据库怎么打开
    要打开mdb数据库,您需要安装Microsoft Access或者一些兼容的软件。以下是打开mdb数据库的步骤:1. 打开Micro...
    99+
    2023-06-08
    mdb数据库 数据库
  • mysql数据库怎么打开
    通过以下步骤打开 mysql 数据库:1. 启动 mysql 服务 (mysqld);2. 连接到数据库服务器 (mysql -u -p );3. 输入密码;4. 选择数据库 (use...
    99+
    2024-04-05
    mysql
  • mongodb怎么打开数据库
    打开 mongodb 数据库的方法:确定数据库端口(默认 27017)使用 mongo shell 连接数据库选择要打开的数据库(use )验证连接(db.stats()) 如何打开 ...
    99+
    2024-04-08
    mongodb
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作