Go的测试

本文章整理自——字节跳动青年训练营(第五届)后端组

测试主要包括:回归测试、集成测试、单元测试

一、单元测试


其中测试单元可以是函数,也可以是模块

规则:

1.所有测试文件都以_test.go结尾

2.测试函数命名规范:func TestXxx(*Testing.T)

3.初始化逻辑需要放置在TestMain中

以下是一个简单的测试:
测试函数HelloTom是否能打印出“tom”,如果不行,则启动错误打印

import "testing"func HelloTom() string {return "jerry"
}func TestHelloTom(t *testing.T) {output := HelloTom()expectOutput := "tom"if output != expectOutput {t.Errorf("Expected %s do not match actual %s", expectOutput, output)}
}

使用以下指令启动测试:

go test 文件名.go

很显然,测试不通过,实际输出为jerry

只要将HelloTom的输出改为"tom"就可以通过测试

import ("github.com/stretchr/testify/assert""testing"
)func HelloTom() string {return "tom"
}func TestHelloTom(t *testing.T) {output := HelloTom()expectOutput := "tom"assert.Equal(t, expectOutput, output)
}

上述的代码中使用了来自github的库"github.com/stretchr/testify/assert" ,在判断输出是否相等的时候使用了assert.Equal()函数,合理使用第三方库可以减轻我们的开发负担

最终运行结果如下:

以上是单元测试的简单示例

1.2单元测试的评价标准

单元测试的标准主要是代码覆盖率,覆盖率越高则证明越多的代码经过了测试。下面我们通过一个例子来了解代码覆盖率。
测试代码覆盖率需要两个文件,分别为被测试的代码xxx.go和负责运行测试程序的xxx_test.go
首先是被测试代码Judge.go

// 判断学生成绩是否合格
func JudgePassLine(score int16) bool {if score >= 60 {return true}return false
}

接下来是测试程序Judge_test.go

import ("github.com/stretchr/testify/assert""testing"
)func TestJudgePassLineTrue(t *testing.T) {isPass := JudgePassLine(70)assert.Equal(t, true, isPass)
}

测试代码覆盖率的命令如下:

go test 测试程序 被测试的代码 --cover
示例: go test Judge_test.go Judge.go --cover

输出如下

输出显示代码覆盖率为66.7%,这是因为JudgePassLine一共有三行代码,其中score=70的时候,只会执行他的if语句和return true语句,因此覆盖了66.7%的代码。另外可以提高测试样例数量,使得覆盖率为100%

实际项目中,达到100%覆盖率是可望不可及的,一般项目对于主流层需要覆盖50%,而对于资金类的交易等关键操作,需要达到80%的覆盖率。对于测试,需要有以下要求:

  • 测试分支完备独立,不重不漏,全面覆盖
  • 测试单元粒度足够小,函数职责单一

1.3 对依赖的单元测试


我们在项目中需要依赖一些缓存、数据库或者文件等,对其的测试有两个要求:

  • 幂等:重复运行一个测试其结果是一样的
  • 稳定:单元测试是相互隔离的

1.3.1 对文件的处理

对文件的测试主要是用Mock机制
比如有一个函数是用于将文本中所有的11都替换为00,但是用传统方法是无法做到反复测试的!一旦运行了该函数,文本中的11就全部被替换为00了,如果再次运行,那么实际上这个函数的执行流程实际上是和第一次不一样的,而且一旦有人删除了该文件或者修改了该文件,也会改变测试结果,不满足幂等和稳定的要求

import ("bufio""os""strings"
)func ReadFirstLine() string {open, err := os.Open("log")defer open.Close()if err != nil {return ""}scanner := bufio.NewScanner(open)for scanner.Scan() {return scanner.Text()}return ""
}func ProcessFirstLine() string {line := ReadFirstLine()destLine := strings.ReplaceAll(line, "11", "00")return destLine
}

此时我们就需要使用到Mock函数进行打桩。我们使用到的比较常用的Mock包是Monkey,其代码仓库地址是:https://github.com/bouk/monkey 。其中打桩可以使用函数A去替换需要被测试的函数B。其中Patch()为打桩函数,Unpatch()为卸桩函数。

施工中

【青训营】Go的测试相关推荐

  1. 字节青训营第三课之高质量编程与性能调优实战的笔记和总结

    这是字节青训营第三课:高质量编程与性能调优实战的笔记和总结 概要 准备 尝试使用 test 命令,编写并运行简单测试 尝试使用 -bench参数,对函数进行性能测试 推荐阅读Go代码Review建议. ...

  2. 字节青训营抖音APP

    You just work hard, the rest is up to time GitHub地址:https://github.com/xiaodainiao/TikTokLite TikTok ...

  3. 【Go入门】Socks5代理服务器实现 翻译api调用 | 青训营笔记

    这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记. [课程一]Go基础 主要内容 第一节课主要介绍了go的语法基础,包括变量.循环分支.数组切片.函数方法.错误处理.字符串.格式化处理. ...

  4. Go语言上手(一) | 青训营笔记

    这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记. 文章目录 语法速览 基础语法 第一:类型 第二:内置库部分 json库的使用 时间库的使用 字符串和数字互转 os相关信息 实战项目 ...

  5. HTML+CSS实现按钮手风琴效果 | 青训营笔记

    HTML+CSS实现按钮手风琴效果 | 青训营笔记 需求描述 HTML部分 CSS部分 完整代码 效果展示 这是我参与「第四届青训营」笔记创作活动的的第7天. 需求描述 实现一排居中的五个图标,默认为 ...

  6. EXPER LOG | 作为ByteDance青训营-客户端-项目leader的历程和收获

    ~此处为记录2022SUMMER青训营,我担任项目组长时,在团队协作,项目任务分配,规则商议协定以及收获心得 ~还在更新中 极简tiktok内容介绍: 榜单模块(主页面一) 榜单页面设计 历史数据查询 ...

  7. 字节青训营第一课之go语言入门的笔记和总结

    有幸参加了字节跳动举办的青训营活动,主要是go语言的编程实践,我将会整理课程的笔记和总结,欢迎关注! 1Go语言简介 由于Go语言有语法简单.高性能等特点,因此国内外各大公司如谷歌.腾讯.字节等都在使 ...

  8. 字节跳动青训营笔试题解

    文章目录 前言 一.单选题 二.多选题 三.编程题 T1.旋转数组最大值 题目 思路 代码 T2.社交圈 题目 思路 代码 四.简答题 题目 思路 前言 第五届字节跳动青训营-后端专场笔试题解,简单做 ...

  9. 三个小项目入门Go语言|字节青训营笔记

    前言 这是青训营的第一课,今天的课程比较快速的讲解了go语言的入门,并配合三个小的项目实践梳理所学知识点,这里详细回顾一下这三个项目,结合课后作业要求做一些代码补充,并附上自己的分析,青训期间的所有课 ...

  10. Go语言实战案例 | 青训营笔记

    这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天 前言 在上一篇笔记中,已经总结了 Go 语言的基础语法和一些常见标准库的使用方法,本文主要基于之前的基础,通过两个实战的例子对 Go 的基础语 ...

最新文章

  1. asio boost 异步错误处理_boost::ASIO的同步方式和异步方式
  2. 学Java需要下载什么软件?都有什么作用?
  3. 数字三角形W(加强版) codevs 2189
  4. 自动编译和提交脚本(结合svn和visual studio)
  5. Spring框架中的Quartz定时任务使用笔记(通过@Scheduled注解的方式实现)
  6. 机器视觉---九点标定
  7. 基于Verilog的按键控制LED灯
  8. linux work有关的命令,VM workstation 中linux 命令
  9. python 运行出现flask运行时提示出错了或者报服务器出错,ValueError: View function did not return a response...
  10. winform DevComponents.DotNetBar2 添加到工具栏方法
  11. nodejs 配置全局 globle 缓存 catch
  12. 财务结账方法:账结法和表结法
  13. GAN介绍 - GAN是如何工作的?
  14. Hidistro 易分销2.0 源码带注释非反编译源码真正完整版本
  15. 币圈进化,IFO、IHO玩法更高级,李笑来Candy“糖果”野望未来
  16. 163邮箱会员揭秘,163邮箱注册,你最想了解的几件事
  17. java interface接口和多继承
  18. 腾讯云tcp认证资料考点包含哪些知识?
  19. 为什么要配置环境变量
  20. 嵌入式Linux C编程学习之路(八)——read/write,lseek函数,cp指令的代码实现

热门文章

  1. OCFS,OCFS2,ASM,RAW 讨论主题合并帖(转)
  2. 深度学习(TensorFlow)环境搭建:(一)Ubuntu16.04+1080Ti显卡驱动
  3. Android 开发学习资料
  4. 单片机考试及答案c语言版,51单片机期末考试试卷及答案
  5. Steam串流投屏-Moonlight与SteamLink(2022/3/7更新)
  6. Matlab/Admas联合仿真提示 输入位移曲线 输出速度曲线为0的解决方法
  7. 修改mac终端命令行的前缀
  8. el-dialog弹出框内容被遮罩层遮住了
  9. 前端入门css3-----字体引入
  10. 无法定位程序输入点 except_吉林财务公司服务商,ai拍图识字识物小程序开发_绘政科技...