这是我参与「第五届青训营」伴学笔记创作活动的第 3 天。
测试
测试关系着系统的质量,是避免事故的最后一道屏障。
测试可分为回归测试、集成测试、单元测试,测试覆盖率逐渐变大,成本逐渐降低
-
回归测试
一般是QA同学手动通过终端回归一些固定的主流程场景
-
集成测试
对系统功能维度做测试验证
-
单元测试
测试开发阶段,开发者对单独的函数、模块做功能验证,单元测试在一定程度上决定代码质量。
过程为对测试单元输入,将所得输出与期望输出对比,以达到保证项目质量,提升效率的目的。
-
单元测试规则:
所有测试文件以_test.go结尾;测试函数命名为 func TestXxxx(t *testing.T); 初始化逻辑放到TestMain中;
可使用assert
-
覆盖率,
用来衡量代码是否经过了足够的测试,评价项目的测试水准;
运行go test命令时加上--cover
单元测试Tips:
一般覆盖率在50%-60%,较高覆盖率在80+%;
测试分支相互独立、全面覆盖;
测试单元粒度足够小,函数单一职责;
-
Mock测试
实际项目单元测试外部依赖要求幂等和稳定。Mock测试,测试可以在任何时间执行,完全不依赖于本地文件以实现幂等和稳定的目的。
幂等,多次测试运行结果一样;稳定,测试相互隔离,能在任何时间、环境下运行
开源mock测试库,github.com/bouk/monkey
使用方法: 打桩,用一个函数A去替换函数B,B是原函数,A就是打桩函数
//target是原函数,被替换的函数,replacement是需要打桩的函数 func Patch(target,replacment interface{})*PatchGuard{} //打桩结束后卸载掉 func Unpatch(target interface{})bool{} -
基准测试
测试程序的运行性能和CPU的资源消耗程度,使用方法类似于单元测试。
测试函数为 func BenchmarkXxx(b *testing.B){ }
支持并行测试func BenchmarkXxxxParallel(){ }
tips: 高性能随机数fastrand,对并发支持较好,但牺牲了一定的数列一致性,大多数场景适用 github.com/bytedance/g…
项目实践
-
需求分析
面向对象,分析涉及元素实体,实体属性及联系;ER图
-
项目设计
分层结构
数据层repository,数据Model,封装外部数据的增删改查;
逻辑层service,业务Entity,接受数据层数据,处理核心业务逻辑输出;
视图层controller,视图View,处理和外部的交互逻辑,封装数据格式;
-
组件工具
go web框架 Gin github.com/gin-gonic/g…
go get gopkg.in/gin-gonic/gin.v1@v1.3.0
-
业务实现
从下至上
repository 构建相关结构体,话题和回帖,实现对应相关操作,查询。 sync.Once 适合高并发场景下只执行一次的场景,单例模式,减少存储的浪费;
service 定义实体,页面信息
实现逻辑:参数校验,准备数据,组装实体 可并行处理controller 构建view对象,处理业务错误码
最后,通过gin搭建web框架。初始化数据索引,初始化引擎配置,构建路由,启动服务,运行测试
总结
老师在项目实践中对项目进行拆解,引导我们分析设计代码,最后测试运行,跑通了整个的项目流程,学到了后期实现项目的开发思路。