go语言进阶与测试管理 | 青训营笔记

134 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第2天,今天难度比昨天高,前面还是能跟上,到后面实现项目那里确实晕😵,这几天抓紧时间啃下来。

1 语言进阶

1.并发与并行

1.1 gorotine

go可以充分发挥并发优势
协程,用户态的轻量级线程,协程kb,内核态线程mb
例子
实现快速,开启协程运行
go语言中只需在函数前加go关键字就可创建协程,并行
创建协程非常方便

1.2 csp

channel:通过通信共享内存,信号量:共享内存实现通信
在计算机系统学习了信号量的实现,确实可能发生并发安全所以用信号量进行互斥
老师稍微讲了下原理,目前是囫囵吞枣的状态,回头在细细分析二者的优劣及差异

1.3 channel

make关键字(chan元素类型,缓冲大小) 有无缓冲大小代表 有无缓冲通道
defer close 延迟关闭
//创建名为src的channel,传递数据到src
src:=make(chan int)
go func(){
defer close(src)
for(i:=0;i<10;i++){
src<-i
}
}
sync:

1.4 并发安全lock

共享内存保持通信,发生数据映态 协程之间通信

1.5WaitGroup

无法知道阻塞时间,无法知道该sleep多久
add(),done(),wait()
计数器
开启协程+1,结束-1,主协程阻塞直到为0

2依赖管理

这一部分非常好理解
个人认为一句话,就是解决依赖包的版本冲突问题
运用依赖包,管理依赖包非常重要

2.1依赖管理演变:

gopath,go vendor,go module
不同环境版本不同

2.1.1 gopath

项目代码直接依赖src的代码
弊端,a项目与b项目依赖同一pkg的不同版 本,无法实现多版本控制

2.1.2 go vendor

增加vender文件,每个项目都引入一份依赖的副本
解决多个项目需要同一个pkg依赖的冲突, 但可能间接

2.1.3 go module

通过 go.mod文件管理依赖包版本
通过go get/go mod 指令管理pkg

2.2依赖管理三要素

配置文件 go.mod
中心仓库管理依赖库 peoxy
本地工具 go get/mod

2.3 依赖管理 - go.mod

2.3.1依赖管理基本单元

元素库
单元依赖
依赖标识:[mod path][version]

2.3.2 依赖配置 - version

语义化版本
major-minor-patch
major:可不兼容
minor:新增函数
patch:修bug

伪版本 默认生成伪版本号

2.3.3依赖配置 -indirect

直接依赖direct,间接依赖indirect

2.3.4 incompatible

无go.mod,且为2.0依赖加上+incompatible

2.3.5 配置依赖 - 依赖图

选择最低的兼容版本,课堂举的例子感觉不太符合

2.3.6 依赖分发 - 回源-proxy

github svn等,主要是关注如何得依赖包
缺点,无法保证构建稳定性
代码托管平台负载压力

利用proxy做中转站,保证稳定可靠,

GOPROXY=“proxy1.cn,https://proxy2.cn,…
proxy1->proxy2->源站

2.3.7 工具 - go get

。。。。。。

2.3.8 工具 - go mod

init 初始化创建go.mod文件
download 把所有依赖拉下来
tidy 增加需要依赖,删除不需要依赖

3.测试

回归测试
集中测试
单元测试

3.1 单元测试

输入测试单元得输出校对期望

3.1.1 单元 - 规则

所有测试文件以 _test.go结尾
命名规范
func TestXxxx(t *testing.T){
}
初始化逻辑放到TestMian中
func TestMain(m *testing.M){
//测试前:数据装置等测试准备工作
code:=m.Run()
//测试后,收尾工作
os.Exit(code)
}

3.1.2 单元测试 - 运行

依赖包assert
assert.Equal(t,expectoutput,output)

3.1.3 单元测试 - 覆盖率

go --cover
检验代码是否经过足够测试,所有代码是否都经过测试过。
一般50%~60%,较高80%以上

3.2 单元测试 - 依赖

外部依赖=>稳定&幂

3.3 单元测试例子 - 文件管理

测试文件可能被删改

3.4 单元测试 -mook

快速mock函数
打桩:替换
为一个函数打桩
为一个方法打桩
func Patch(target,replacement interface{})//打桩
func Unpatch(target interface{})//删除桩
实质:运行时替换函数地址

3.5 基准测试

3.5.1 基准测试 -例子

随机选择执行服务器,

3.5.2 基准测试 - 运行

Benchmark为开头 进行基准测试

3.5.3 基准测试 - 优化

函数前加Fast FastSelect()

4.项目实践

4.1 需求描述

4.2 需求用例

Topic PostList

4.3 ER 图

关系,属性

4.4 分层结构

数据层 repository:
数据model 外部数据增删查改
逻辑层 service :
业务Entity,处理核心业务输出
视图层 controller :
包装一些数据结构,视图view,、

4.5 组件工具

gin 高性能go web 框架
go mod

4.6大项目源码更新

。。。。待续未完