Go语言进阶-工程进阶 | 青训营笔记

66 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
对课程中学到的重要知识点做了笔记,方便后续的回顾

1. 并发编程

2. 依赖管理

2.1 背景

管理依赖库

2.2 Go 依赖管理演进

主要要解决的问题: 不同环境(项目)依赖的版本不同 控制依赖库的版本

2.2.1 GOPATH

  • 环境变量 $GOPATH
  • 项目的文件关系,需要放成以下的形式
    • bin——项目编译的二进制文件
    • pkg——项目编译的中间产物,加速编译
    • src——项目源码
  • 项目代码直接依赖src下的代码
  • go get下载最新版本的包到src目录下

弊端: 无法实现package的多版本控制

2.2.2 Go Vendor

go model vendor

  • 项目目录下增加了vendor文件,所有依赖以副本形式存放在 $ProjectRoot/vendor
  • 依赖寻址方式:vendor=>GOPATH
  • 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。

弊端:

  1. 无法控制依赖的版本。
  2. 更新项目又可能出现依赖冲突,导致编译出

原因: 依赖项目的源码,没法标识版本的这一个概念

2.2.3 Go Module

通过go.mod文件管理依赖包版本 通过go get/go mod指令工具管理依赖包 终极目标:定义版本规则和管理项目依赖关系 go 1.11初始引入 go 1.16默认开启

go mod init # 初始化go.mod
go mod tidy # 更新go.mod文件

依赖管理三要素 1.配置文件,描述依赖——go.mod 2.中心仓库管理依赖库——Proxy 3.本地工具——go get/ mod

2.3 Go Module实践

3. 单元测试

  1. 测试的重要性:测试是避免事故的最后一道屏障
  2. 测试所处的位置: 避免 开发------>测试----->事故
  3. 测试的分类: 回归测试 集成测试 单元测试 从上到下,覆盖率逐层变大,成本却逐层降低

3.1 单元测试

  1. 单元测试流程
  2. go中的单元测试
    1. 所有测试文件以_test.go 结尾
    2. func TestXxx(*testing.T)
    3. 初始化逻辑放到TestMain中
    4. go test HelloWorld_test.go
      1. go test [flags] [packages]
    5. 可以使用开源的包来检测返回是否正常,比如assert
      1. assert.Equal
  3. 如何评估单元测试
    1. 如何衡量代码是否经过了足够的测试?
    2. 如何评价项目的测试水准?
    3. 如何评估项目是否达到了高水准测试等级?
    4. 使用代码覆盖率
      1. go test HelloWorld_test.go --cover,增加cover就可以显示测试覆盖率
    5. 小技巧
      1. 一般覆盖率:50%~60%,较高覆盖率80%+
      2. 测试分支相互独立、全面覆盖
      3. 测试单元粒度足够小,函数单一职责。

3.2 Mock测试

  1. 依赖 --->FIle 单元------->DB ----> 幂等----> Mock --->cache 稳定----> 有时候单元测试会受到外部依赖的限制,比如依赖文件数据库,cache等等,比如网络波动,文件不存在,都会影响测试的效果,所以需要通过mock测试来尽量消除这些影响
  2. 快速mock函数
    1. 为一个函数打桩
    2. 为一个方法打桩
    3. 比如:对读取文件的函数打桩,使得其不依赖本地文件

3.3 基准测试

  1. 概念
    1. 优化代码,需要对当前代码分析
    2. 内置的测试框架提供了基准测试的能力
  2. 举例
    1. 对服务器进行负载均衡处理,优化rand随机数分配函数

4. 项目实战

课后个人总结

  1. 之前只是会用go get来拉取model包,通过课程的学习,对依赖管理的认识更加深刻了
  2. 了解到了常用的测试方法和测试技术,可以用在后面的大项目中

参考资料

[mock测试]github.com/bouk/monkey