GO语言进阶与依赖管理&工程实践及测试 | 青训营笔记

77 阅读2分钟

Go 语言进阶与依赖管理&工程实践及测试

语言进阶

1.1 Goroutine

  1. 协程:用户态,轻量级线程,栈kb
  2. 线程:内核态,线程跑多个协程,栈MB
  3. ex: 快速打印hello goroutine

1.2 CSP

通过通信共享内存,通过共享内存实现通信

1.3 Channel

make(chan 元素类型,[缓冲大小])

1.4 并发安全Lock

  1. lock sync.Mutex
  2. lock() unlock()

1.5 WaitGroup

  1. 计数器
  2. 开启协程+1;执行结束 -1;主携程阻塞直到计数器为0

依赖管理

站在巨人的肩膀上依赖库

2.1 Go依赖管理演进

GOPATH>Go Vendor>Go Module

2.1.1 GOPATH

  1. $GOPATH环境变量
    (bin编译的二进制文件,pkg中间产物,src项目源码)
    依赖src下的代码
  2. GOPATH-弊端
    无法实现package多版本控制

2.1.2 Go Vendor

  1. 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
  2. Go Vendor-弊端
    无法控制依赖版本
    更新项目有可能出现依赖冲突,导致编译错误

2.1.3Go Module

定义版本规则和管理项目依赖关系

2.2 依赖管理三要素

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

2.3.1依赖配置 - go.mod

    ...
    module abc/def/gh//依赖管理基本单元
    go 1.16  //原生库
    require(      //单元依赖
        abc/xxxx
    )
    ...

2.3.2 依赖配置-version

  1. 语义化版本
    ${MAJOR}.${MINOP}.${PATCH}
    V1.3.0
    V2.3.0
  2. 基于commit伪版本
    vX.0.0-yyyymmddhhmmss-abcdefg12345

2.3.3 依赖配置-indirect

2.3.4 依赖配置-incompatible

2.3.5 依赖分发-回源

依赖分发-Proxy

2.3.6 依赖分发-变量 GOPROXY

2.3.7 工具- go get

2.3.8 工具- go mod

init //初始化
download //下载
tidy //增加需要的依赖

测试

  1. 回归测试/集成测试/单元测试
  2. 覆盖率变大,成本降低

3.1单元测试

3.1.1单元测试-规则

  1. _tets.go结尾
    func TestXxx(*testing.T)
    初始化逻辑放到TestMain
  2. 保证质量,提升效率

3.1.2单元测试-例子

3.1.3单元测试-运算

3.1.4单元测试-assert

3.1.5 单元测试-覆盖率

代码覆盖率-测试用例的覆盖度

3.1.5 单元测试-Tips

  1. 一般覆盖率 50-60%,较高覆盖率80%+
  2. 测试分支相互独立、全面覆盖
  3. 测试单元粒度足够小,函数单一职责

3.2 单元测试-依赖

外部依赖 =》 稳定&幂等

3.3 单元测试-文件处理

3.4 单元测试-Mock

  1. 为一个函数打桩
  2. 为一个方法打桩

3.5 基准测试

  1. 优化代码
  2. 内置的测试框架提供基准测试的能力

3.5.1 基准测试-例子

3.5.2 基准测试-运行

3.5.3 基准测试-优化

项目实践

4.1 需求描述

社区话题页面

4.2 需求用例

浏览消费用户

4.3 ER图

4.4 分层结构

数据层/逻辑层/视图层

4.5 组件工具

go web框架 go mod

4.6 Repository

Topic Post

Repository-index

数据行 -> 内存Map

Repository-查询

4.7 Service

4.8 Controller

4.9 Router

4.10 运行

总结:通过一个半小时的时间粗略地过了一遍go语言依赖管理和工程实践测试相关内容,具体的源代码还需要花时间去分析一下。