GO语言实战案例(二) | 青训营

67 阅读3分钟

测试

避免事故的最后一道屏障

1.回归测试: 使用终端,使用一些具体的场景来看产品效果如何,是否达到预期

2.集成测试: 对于系统功能性的测试,自动化的测试

3.单元测试: 主要面对开发阶段,对逐个函数进行测试

从上到下,测试的覆盖率逐层上升,但是成本却在逐层下降

单元测试

输入数据,通过一些函数和模块然后输出结果,与我们的期望进行比较,看是否达到预期要求,以此来保障质量和提高效率

单元测试规则

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

image.png

以此来更方便的判断哪些是源代码,哪些是测试代码

2.测试函数命名规范

func TestXxx(*testing.T)来命名测试函数

3.初始化逻辑放到TestMain

image.png

覆盖率

image.png

如果输入的score70,则会执行前面的两行代码,而return false这一行不会被执行,所以这个代码的覆盖率为66.7%,还需要再另外写一个测试函数,输入score50,这样会执行return false这一行代码,这样两个测试函数下来,代码的覆盖率就达到了100%

小tips

1.一般覆盖率为50%-60%,较高覆盖率为80%以上

2.测试分支要求独立,全面覆盖

3.测试函数单一职责

依赖外部组件

1.要求满足幂等性: 重复运行一种情况时结果是一样的

2.要求满足稳定性: 单元测试能够相互独立运行

Mock

链接:monkey : github.com/bouk/monkey

快速Mock函数:

1.为一个函数打桩

2.为一个方法打桩

打桩:

参考博客:一文看懂单元测试中的打桩_打桩测试_alibli的博客-CSDN博客

定义: 函数打桩,就是将一个函数用另一个函数实现(桩代码)进行替换,以达到在原有函数入口的位置执行新的实现。

目的: 函数打桩的目的一般是隔离、占位和控制。

  • 隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行
  • 占位就是用桩对一些未实现的函数进行占位
  • 控制是指在测试时,人为设定相关代码的行为,使之符合测试需求。

方法: 编译时,链接时,运行时

  • 编译时:用宏定义#define,在预处理时进行字符串替换,将原函数定义成桩函数的形式。
  • 链接时:链接时打桩就是调用的函数库替换。
  • 运行时:运行时打桩就是函数地址替换。

基准测试

  • 优化代码,需要对当前代码分析
  • 内置的测试框架提供了基准测试的能力

基准测试以Benchmark为前缀,需要一个testing.B类型的参数b

image.png

基准测试并不会默认执行,需要增加-bench参数,所以我们通过执行go test -bench=Split命令执行基准测试

image.png

参考博客:go语言的性能基准测试、性能优化测试和性能调优_go 基准测试_ydl1128的博客-CSDN博客

小结

本篇文章主要是关于工程实践中测试的部分,几乎所有东西都是新学的,学起来也是相当吃力,只能尽可能的写一些相关笔记,主要是学习了如何在工程项目中中测试相关的代码和函数功能,来保障代码的安全性,使功能得到保障,尽可能提高代码的覆盖率,这样可以减少bug的出现,后面打算继续再写一些工程实践相关的笔记