测试
从上到下,覆盖率逐层变大成本逐层降低
1、回归测试
2、集成测试
3、单元测试
单元测试
保证质量与效率
- 规则
- 所有测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
- 测试前:配置初始化、数据装载等初始化工作
- 测试后:释放资源等收尾工作
- 运行
- go test [flags][packages]
- RUN TestHelloTom函数
- import assert/github.com/stretchr/testify
- 覆盖率 评估
- 对不同环节保证覆盖性
- 一般覆盖率为50%-60%,较高为80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
- 依赖
- 外部依赖=》稳定(相互独立)&幂等 =》mock
- 快速mock(为一个函数/方法打桩)patch和Unpatch函数
- 基准测试
- 优化代码,需要对当前代码分析
- 内置的测试框架提供基准测试的能力
项目实践
展示话题和回帖列表、仅仅实现本地web服务、话题和回帖数据用文件存储
分层结构
- 数据层:数据model,外部数据的增删查改
- 逻辑层:业务entity,处理核心业务逻辑输出
- 视图层 :视图view,处理和外部的交互逻辑
- 组件工具:gin高性能go web框架、go mod init+go get
repository
- index数据索引,初始化话题数据索引
- 查询:单例模式通过话题id上诉逻辑层
service
- 实体+参数校验(严格校验)—准备数据—组装实体
controller
- 构建view对象
- 业务错误码
router
- 初始化数据索引
- 初始化引擎配置
- 构建路由
- 启动服务
- go run server go
实现猜谜游戏
-
导入所需的包:
package main import ( "fmt" "math/rand" "time" ) -
在
main函数中设置最大数字和生成随机数的种子:func main() { maxNum := 100 rand.Seed(time.Now().UnixNano()) secretNumber := rand.Intn(maxNum) -
初始化一个变量
guess用于存储玩家的猜测,并且打印游戏提示:var guess int fmt.Println("Please input your guess") -
使用无限循环来接收玩家的猜测并进行判断:
for { -
使用
fmt.Scanf读取玩家的整数输入,并将其存储到guess变量中。如果输入不是有效的整数,则打印错误提示并继续循环:_, err := fmt.Scanf("%d", &guess) if err != nil { fmt.Println("Invalid input. Please enter an integer value") continue } -
打印玩家的猜测,并根据猜测与秘密数字的大小关系,给予不同的提示信息:
fmt.Println("Your guess is", guess) if guess > secretNumber { fmt.Println("Your guess is bigger than the secret number. Please try again") } else if guess < secretNumber { fmt.Println("Your guess is smaller than the secret number. Please try again") } else { fmt.Println("Correct, you Legend!") break // 猜对了,退出循环 } } }
通过使用 fmt.Scanf 直接读取整数输入,省去了使用 bufio 和 strconv 处理输入的步骤,使得代码更加简洁易读。同时保持了游戏的逻辑,让玩家猜测数字并获得相应的提示,直到猜对为止。