三、测试
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 实体
- 话题
Topic:id、title、content、create_time - 回帖
Post:id、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