GO语言工程实践课后作业:实现思路、代码以及路径记录;| 青训营

120 阅读2分钟

测试

从上到下,覆盖率逐层变大成本逐层降低

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

实现猜谜游戏

  1. 导入所需的包:

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
  2. main 函数中设置最大数字和生成随机数的种子:

    func main() {
        maxNum := 100
        rand.Seed(time.Now().UnixNano())
        secretNumber := rand.Intn(maxNum)
    
  3. 初始化一个变量 guess 用于存储玩家的猜测,并且打印游戏提示:

        var guess int
        fmt.Println("Please input your guess")
    
  4. 使用无限循环来接收玩家的猜测并进行判断:

        for {
    
  5. 使用 fmt.Scanf 读取玩家的整数输入,并将其存储到 guess 变量中。如果输入不是有效的整数,则打印错误提示并继续循环:

            _, err := fmt.Scanf("%d", &guess)
            if err != nil {
                fmt.Println("Invalid input. Please enter an integer value")
                continue
            }
    
  6. 打印玩家的猜测,并根据猜测与秘密数字的大小关系,给予不同的提示信息:

            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 直接读取整数输入,省去了使用 bufiostrconv 处理输入的步骤,使得代码更加简洁易读。同时保持了游戏的逻辑,让玩家猜测数字并获得相应的提示,直到猜对为止。