Go语言工程实践之测试 | 青训营笔记

80 阅读2分钟

Go语言工程实践之测试

测试是避免事故的最后一道屏障。

测试的主要分类

image-20230609083846742.png

单元测试

image-20230609084010882.png

单元测试的规则:

  1. 所有的测试文件以_test.go结尾
  2. func TestXxx(*testing.T)
  3. 初始化逻辑放到TestMain中

举例:

 func HelloTom() string {
     return "Jerry"
 }
 ​
 func TestHelloTom(t *testing.T) {
     output := HelloTom()
     expectOutput := "Tom"
     if output != expectOutput := "Tom"{
         t.Errorf( format: "Expected %s do not match actual %s",expectOutput,output)
     }
 }

代码覆盖率

命令:go test xxx_test.go --cover

Tips:

  • 实际开发中,一般覆盖率:50%~60%,较高覆盖率80%+。
  • 测试分支相互独立、全面覆盖。
  • 测试单元粒度足够小,函数单一职责。

依赖

image-20230609103440230.png

幂等性:当重复多次运行某个单元时,运行的结果与第一次运行后的结果是一样的。

稳定性:单元测试相互之间是隔离的,任何时间任何函数是可以独立的运行,并且多次运行结果是一致的。

Mock

monkey : github.com/bouk/monkey

快速Mock函数

  • 为一个函数打桩
  • 为一个方法打桩

基准测试

  • 优化代码,需要对当前代码分析。
  • 内置的测试框架提供了基准测试的能力。
 func BenchmarkSelect(b *testing.B){
     InitServerIndex()
     b.ResetTimerO()
     for i := 0; i < b.N; i {
         select()
     }
 }
 ​
 func BenchmarkSelectParallel(b *testing.B){
     InitServerIndex()
     b.ResetTimerO()
     b.RunParallel(func(pb *testing.PB){
         for pb.Next() {
             select()
     }
 }

项目实践

需求描述

社区话题页面

  • 展示话题(标题,文字描述)和回帖列表
  • 暂不考虑前端页面实现,仅仅实现一个本地web服务
  • 话题和回帖数据用文件存储

需求用例

image-20230609105057682.png

E-R图(实体关系图)

image-20230609105208626.png

分层结构

image-20230609105343830.png

  • 数据层: 数据Model,外部数据的增删改查。
  • 逻辑层: 业务Entity,处理核心业务逻辑输出。
  • 视图层: 视图view,处理和外部的交互逻辑。

对于查询数据,建立索引(内存Map),实现快速查找。

项目运行启动,查询某个Topic

image-20230609111733412.png