Go语言工程实践笔记(下) | 青训营

93 阅读2分钟

三、测试

1. 单元测试

1.1 测试单元

  • 函数
  • 模块
  • 接口

1.2 规则

  • 所有测试文件以_test.go结尾
  • 测试函数命名func TestXxx( *testing.T )
  • 初始化逻辑放于TestMain()
  • 测试运行工具go test 测试文件 源文件
示例
package main

import "fmt"

func HelloTom() string {
	return "Tom"
}

func main() {
	fmt.Println(HelloTom())
}

package main // 与测试函数在同一包下

import (
	"testing"
	// "github.com/stretchr/testify/assert"
)

func TestHelloTom(t *testing.T) {
	output := HelloTom()
	expectOutput := "Tom"
	if output != expectOutput {
		t.Errorf("Expected %s do not match actual %s", expectOutput, output)
	}
	// assert.Equal(t, expectOutput, output)
}


1.3 覆盖率

  • 后缀工具 --cover
  • 一般覆盖率:50% ~ 60%
  • 较高覆盖率: 80% +

2. Mock测试

2.1 外部依赖

测试目的

  • 幂等:测试结果始终一致,不受外部依赖的影响
  • 稳定:隔离运行,具有很高独立性

2.2 Mock函数

  • 为测试函数或测试方法打桩, 使得测试不依赖外部文件也能正常运行
  • 工具monkey.Patch()monkey.Unpatch()

3. 基准测试

测试代码运行性能以及CPU损耗等

3.1 规则

测试函数命名func BenchmarkXxx( *testing.B )

3.2 优化随机数生成

fastrand通过牺牲一部分随机性,来提升生成随机数的性能

四、项目实战

1. 需求设计

1.1 需求描述

  • 社区话题页面,用于展示话题和回帖列表
  • 暂不考虑前端页面实现,仅实现本地web服务
  • 使用文件存储数据

1.2 实体

  • 话题Topicid、title、content、create_time
  • 回帖Postid、topic_id、content、create_time

2. 代码开发

2.1 分层结构

  • 数据层:数据Model,数据增删改查
  • 业务层:业务Entity,核心业务逻辑
  • 视图层:视图View,外部交互逻辑

2.2 组件工具

  • Gin 高性能go web框架
  • Go Mod 项目依赖管理

2.3 Repository

  • QueryTopicById()
  • QueryPostsByParentId()

利用map实现索引查询

2.4 Service

  • 流程:参数校验 -> 准备数据 -> 组装实体
  • 并行处理: 话题信息、回帖信息各开启一个协程,并行处理

2.5 Controller

利用JSON结构体构建并发送View对象、业务错误码

2.6 Router

  • 初始化数据、引擎配置
  • 构建路由
  • 启动服务

3. 测试运行

工具:go run server.go