golang 单元测试

文件格式:go单元测试,有固定的名称格式,所有以_test.go为后缀名的源文件在执行go build 时不会被构建成包的一部分,他们是go test 测试的一部分。

测试函数

函数格式:每个测试函数是以Test为函数名称前缀。

每个测试函数必须导入testing包。

func TestName(t *testing.T) {

// ...

}

基准测试(benchmark)

函数格式:函数前缀名称Benchmark。

作用:用于衡量函数的性能。会多次运行基准函数,计算一个平均的执行时间。

示例函数

函数前缀名称Example

作用:提供一个由编译器保证正确性的示例文档。

命令介绍

参数-v可用于打印每个测试函数的名字和运行时间:

go test -v

2.-run 测试制定的函数名称

go test -v -run="函数名称"

3.-cover 查看测试覆盖率

go test -v -run="" -cover

go test -cover /model/test/list

4.最后统统执行一遍全部测试用例

go test

5.示例

go test -run '' # Run all tests.

go test -run Foo # Run top-level tests matching "Foo", such as "TestFooBar".

go test -run Foo/A= # For top-level tests matching "Foo", run subtests matching "A=".

go test -run /A=1 # For all top-level tests, run subtests matching "A=1".

表格驱动测试(自动生成)

安装gotests

执行下面命令

go get -u github.com/cweill/gotests

2.将下载的gotests目录,配置到PATH环境变量中

export PATH=$PATH:$GOBIN:$GOPATH:$MYSQLBIN

gotests使用

-all

generate tests for all functions and methods

为所有函数和方法生成go测试

-excl string

为没有匹配的函数和方法生成go测试

regexp. generate tests for functions and methods that don't match. Takes precedence over -only, -exported, and -all

-exported

为导出的函数和方法生成go测试。

generate tests for exported functions and methods. Takes precedence over -only and -all

-i

在错误消息中打印测试输入

print test inputs in error messages

-nosubtests

禁用子测试生成。仅适用于Go 1.7+

disable generating tests using the Go 1.7 subtests feature

-only string

正则表达式。生成仅匹配的函数和方法的测试。优先于-all

regexp. generate tests for functions and methods that match only. Takes precedence over -all

-template_dir string

可选的。包含自定义测试代码模板的目录的路径

optional. Path to a directory containing custom test code templates

-w

将输出写入(测试)文件而不是stdout

write output to (test) files instead of stdout

常用操作

1.进入对应的要被生成单元测试的目录

2.在该目录下执行命令

3.生成指定函数的单元测试,输出到命令行,然后复制粘贴到目标处。

gotests -only "函数名称" 文件名称.go

4.生成全部测试函数

gotests -all 文件名称.go

gotests -only " 方法名称" 文件名称

gotests -all -w origin.go, origin_test.go

会自动创建在当前目录下,并自动生成测试代码,只需要将不同的测试数据按照tests定义的结构写在//TODO:Add test cases下面,测试用例就完成了。

mock测试

参考文章

mock是单元测试中常用的一种测试手法,mock对象被定义,并能够替换掉真实的对象被测试的函数所调用。

而mock对象可以被开发人员很灵活的指定传入参数,调用次数,返回值和执行动作,来满足测试的各种情景假设。

使用场景

依赖的服务返回不确定的结果,如获取当前时间。

依赖的服务返回状态中有的难以重建或复现,比如模拟网络错误。

依赖的服务搭建环境代价高,速度慢,需要一定的成本,比如数据库,web服务

依赖的服务行为多变。

为了保证测试的轻量以及开发人员对测试数据的掌控,采用mock来斩断被测试代码中的依赖不失为一种好方法。

每种编程语言根据语言特点其所采用的mock实现有所不同。

mockery

安装

go get github.com/vektra/mockery/.../

使用

Run: mockery -name=Stringer生成的mock名称 and the following will be output to mocks/Stringer.go

1、生成mock文件,默认在./mocks目录下

mockery -name=Mocker接口名

2、生成mock输出到控制台

mockery -name=接口名 -print

代码处理:

1.业务接口

1.定义被mock的接口

2.定义类(实现接口)

3.定义个方法New(),返回该类对象

// 1.定义接口

type Driver interface {

Add(*ImportSet) (int64, error)

}

// 2.定义类,实现该接口

type driverImp struct{}

//3.定义方法,创建该类对象

func NewDriver() Driver {

return &driverImp{}

}

2.生成mock方法

mockery -name=接口名 -print

生成要被mock的方法

3.service层调用处

// 用创建对象的方法,获取对象,调用接口方法

NewDriver().QueryImportDetails(req.ImportUuid)

4.单元测试

func TestFunc(t *testing.T) {

//保存原来的对象helper.ListDrv就是newDrv()

oldFd := helper.ListDrv

//最后还原对象

defer func() {

helper.ListDrv = oldFd

}()

type args struct {

ctx context.Context

req

}

tests := []struct {

name string

args args

want *****

wantErr bool

//在表驱动中,写mock方法

mock func()

}{

{

name: "error",

args: args{

ctx: context.Background(),

req: **,

},

wantErr: false,

want: ***

mock: func() {

mfd := &listmock.Driver{}

mfd.On("QueryCount").Return(int64(0), nil)

mfd.On("QueryList", mock.Anything, mock.Anything).Return([]list.ImportList{{UUID: "xxx", Description: "ddddd"}}, nil)

//还原对象

helper.ListDrv = mfd

},

},

},

// 测试用例

for _, tt := range tests {

// 执行mock方法

tt.mock()

t.Run(tt.name, func(t *testing.T) {

里面的单元测试内容不变

}

常用命令

-v是显示出详细的测试结果,

-cover 显示出执行的测试用例的测试覆盖率

1 测试单个文件,一定要带上被测试的原文件

go test -v -cover file1_test.go file.go

2 测试单个函数方法

go test -v -cover -run TestFuncName

3 测试整个api包

在包统计目录下

go test -v -cover ./api/...

4、自动生成测试用例,为指定的函数生成单元测试,输出到控制台

gotests -only "函数名称" file(源文件名称).go

5、自动生成测试用例,为指定文件生成单元测试,输出到文件中

gotests -all -w origin.go, origin_test.go

6、生成mock

//输出到控制台

mockery -name=接口名 -print

//输出到./mocks/接口名.go文件中

mockery -name=接口名

go mockweb接口_golang 单元测试(gotests、mockery自动生成)相关推荐

  1. 实体类dao接口mysql_利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件...

    解决问题: 可利用MyBatis生成器自动生成实体类.DAO接口和Mapping映射文件. 测试环境准备: 新建一个mysql数据库,例如mungerzTest. 生成一张主键为自增ID的学生表: C ...

  2. 自动生成python接口文档_Django自动生成Swagger接口文档

    Django自动生成Swagger接口文档 1. 前言 当接口开发完成,紧接着需要编写接口文档.传统的接口文档通常都是使用Word或者一些接口文档管理平台进行编写,但此类接口文档维护更新比较麻烦,每次 ...

  3. Django DRF 自动生成接口文档

    文章目录 1. 引子 2. 自动生成接口文档 3. 文档描述说明的定义位置 1. 引子 前端请求的url由谁来写 url 主要有后台来写,写完给前端: 如果后台查询数据,需要借助查询条件才能查询前端需 ...

  4. Spring Boot项目利用MyBatis Generator进行数据层代码自动生成

    概 述 MyBatis Generator (简称 MBG) 是一个用于 MyBatis和 iBATIS的代码生成器.它可以为 MyBatis的所有版本以及 2.2.0之后的 iBATIS版本自动生成 ...

  5. 使用 Source Generator 自动生成 WEB API

    使用 Source Generator 自动生成 WEB API Intro 上次我们介绍了使用 Source Generator 的应用,有小伙伴留言说想要自动生成一套 ABP 相关的东西,我对 A ...

  6. RESTful之自动生成接口文档

    REST framework可以自动帮助我们生成接口文档.[必须是继承自rest_framework才会自动生成文档] 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的 ...

  7. IDEA-Java自动生成单元测试

    最近在写单元测试,感觉写Mock写烦了,于是想看看有没有现成的spring项目的单元测试生成工具. 网上找到了一个Java单元测试回答的集合:Automatic generation of unit ...

  8. springboot 中文文档_比Swagger还好用的自动生成接口文档工具

    JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又不得不做的事情,我们都不喜欢写文档,但除非项目前后 ...

  9. php怎么根据接口文档实现功能,CodeIgniter+swagger实现 PHP API接口文档自动生成功能...

    一.安装swagger 1.首先需要有composer,没有的自行百度安装 2.下载swagger,打开网站https://packagist.org/packages/zircote/swagger ...

最新文章

  1. H5嵌入原生开发小结----兼容安卓与ios的填坑之路
  2. 代言男科、站台微商、变身神棍....这些科学家被捧了几十年,黑历史曝光后,让人三观尽毁......
  3. android 检测摇一摇
  4. MATLAB快速傅里叶变换(fft)函数详解
  5. android时间显示秒,MIUI 12桌面如何显示带秒时钟?
  6. Linux 修改环境变量设置的三种方式
  7. 3.8 main.js-常用配置【uni-app教程uniapp教程(黄菊华-跨平台开发系列教程)】
  8. java 大写中文金额 转 数字
  9. linux下学习db2
  10. Ajax 跨域请求详解
  11. MicrobiomeAnalyst:一款综合的可视化微生物组学数据分析网页工具
  12. Flask开发微电影网站(一)
  13. Linux操作命令符(基本)
  14. 图谱卷积预备知识1:拉普拉斯矩阵
  15. LeetCode - 1705 吃苹果的最大数目
  16. android setdata方法,Android intent.setData方法
  17. 蜡烛图plotly_可视化神器Plotly(5)---参数详解
  18. 做好URL路径优化,帮你快速实现网站排名
  19. 【嵌入式中的C】寄存器清零和置位操作
  20. 【TCP/IP详解】【pause】以太网(PAUSE)流量控制原理

热门文章

  1. 基于python+django学生信息管理系统设计与实现(含程序源码和毕业设计)
  2. 婚礼拍得像MV一样,好感动!(男的看了都想结婚了)
  3. Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时
  4. 学习C语言-学习指针
  5. bootstarp怎么使盒子到最右边_海美迪H7Plus电视盒子:配置喜人,还没有广告?爱了...
  6. cmd 删除本地文件夹及其文件
  7. 雷霆战机 提升关卡经验魔方掉率攻略
  8. T83312 【音乐会】达拉崩吧·上
  9. 【PHP基础】PHP概述及简单语法
  10. 在2022年想创业就一定要注册公司吗?