day2后端与依赖管理、项目测试 | 青训营笔记

76 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天。

主要是学习了依赖管理和项目测试,理解了Go语言项目依赖管理的演进以及项目测试的方法。

一、本堂课重点内容:

  • Go语言进阶与依赖管理
    • 并发编程视角了解Go高性能本质
    • Go依赖管理
  • Go语言工程实践之测试
    • 测试
    • 项目实战

二、Go语言进阶与依赖管理:

1. 并发编程视角了解Go高性能本质

利用了多核

用户态:协程 栈MB

内核态:线程 栈KB

快速打印例子:开多个协程(goroutine)-- go func()协程函数

a. CSP(通信顺序进程)

通信共享内存--通道;而非共享内存实现通信--临界区

Channel 通信 -- 无缓冲(同步)、有缓冲 -- make

例子:

生产--子协程go func发送0-9数字

dest 缓冲 -- 考虑到消费者速度可能比生产者慢

消费--子协程go func计算输入数字平方

主协程main输出

b. Sync包

并发安全 Lock(对共享内存):

5个协程并发执行,多次后最终输出,未加锁结果错误。

WaitGroup -- 区别于sleep

计数器 Add Done Wait

2. Go依赖管理

单体函数--复杂项目--依赖库

GoPATH->GoVendor->GoModule(目前)

a. GoPATH

bin 编译二进制文件 -- pkg 编译中间产物、加速 -- src 项目源码(go get 最新版本存放位置)

弊端: 不同项目依赖同一package的不同版本 -- 无法实现Package多版本控制

b. GoVendor

增加vendor文件,存放依赖包副本

弊端: 一项目依赖多个项目(其依赖于同一package的不同版本)-- 无法控制依赖版本,出现依赖冲突

c. GoModule

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

go.mod 配置文件,描述依赖

go get/go mod 本地工具

Proxy 中心仓库管理依赖库

module 路径
go 1.16 原生库
require(
单元依赖[path][version]
)

version

${MAJOR大版本}.${MINOR新增函数等兼容}.${PATCH有bug修复}

V1.3.0

基于commit伪版本

vX.0.0-yyyymmddhhmmss时间戳-12位哈希码前缀

关键字

indirect间接依赖

incompatible主版本2以上需要增加/vN后缀,无go.mod文件时添加

选最低兼容版本37m处题目

依赖分发--回源

Proxy 保证依赖的稳定、可靠

GOPROXY="url列表,用逗号分割,direct表示源站"

Proxy1->Proxy2->dirext

go get example.org/pkg @ --

go mod -- init创建、download下载模块到本地缓冲、tidy增加需要依赖,删除不需要依赖

三、Go语言工程实践之测试:

1. 测试

事故 -- 通过测试来避免

回归(使用者)-集成(功能)-单元(函数)测试

输入、测试单元(函数、模块……)、输出与期望校对

a. 单元测试

规则:

文件_test.go结尾

func TestXxx(*testing.T)

TestMain:测试前数据装载、配置初始化;测试后,释放资源收尾

go test 运行

assert 校对包

评价:

代码覆盖率,一般50%-60%,较高80%+

测试分支相互独立、全面覆盖

测试单元粒度足够小,函数单一职责

b. Mock测试

单元

--file、DB、Cache

--稳定(函数隔离)、幂等(条件改变结果不变)

--Mock

monkey(mock测试包)

github.com/bouk/monkey

快速Mock函数:func Patch/Unpatch为函数/方法打桩测试、不依赖本地文件

c. 基准测试

用于性能分析、优化代码

2. 项目实战

项目拆解、代码设计、测试运行

a. 需求描述

社区话题页面

需求用例:用户--Topic话题、PostList帖子

ER(实体关系)图:结构体

b. 分层结构

file->

Repository数据层Model->

Service逻辑层Entity->

Controller视图层View->

Client

c. 代码设计

Gin高性能go web框架

github.com/gin-gonic/g…

Repository

Topic, Post

如何查询:

ID index -> map

Service

PageInfo

可用性:并行go func

Controller

构建View对象PageData

业务错误码

Router

初始化数据索引,引擎配置,路由,启动服务

运行

go run server.go

四、作业&课后个人总结:

针对课程中讲解的项目,完善以下功能:

  1. 支持发布帖子;

  2. 本地Id生成需要保证不重复、唯一性;

  3. Append文件,更新索引,注意Map并发安全问题。

砚冰坚,手指不可屈伸,怠之。

五、引用参考:

标题:Go 语言进阶与依赖管理 - 掘金

网址:juejin.cn/course/byte…

标题:Go 语言工程实践之测试 - 掘金

网址:juejin.cn/course/byte…