测试 | 青训营笔记

71 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 3 天。

测试

测试关系着系统的质量,是避免事故的最后一道屏障。

测试可分为回归测试、集成测试、单元测试,测试覆盖率逐渐变大,成本逐渐降低

  • 回归测试

    一般是QA同学手动通过终端回归一些固定的主流程场景

  • 集成测试

    对系统功能维度做测试验证

  • 单元测试

    测试开发阶段,开发者对单独的函数、模块做功能验证,单元测试在一定程度上决定代码质量。

    过程为对测试单元输入,将所得输出与期望输出对比,以达到保证项目质量,提升效率的目的。

  1. 单元测试规则:

    所有测试文件以_test.go结尾;测试函数命名为 func TestXxxx(t *testing.T); 初始化逻辑放到TestMain中;

    可使用assert

  2. 覆盖率,

    用来衡量代码是否经过了足够的测试,评价项目的测试水准;

    运行go test命令时加上--cover

    单元测试Tips:

    一般覆盖率在50%-60%,较高覆盖率在80+%;

    测试分支相互独立、全面覆盖;

    测试单元粒度足够小,函数单一职责;

  3. Mock测试

    实际项目单元测试外部依赖要求幂等和稳定。Mock测试,测试可以在任何时间执行,完全不依赖于本地文件以实现幂等和稳定的目的。

    幂等,多次测试运行结果一样;稳定,测试相互隔离,能在任何时间、环境下运行

    开源mock测试库,github.com/bouk/monkey

    使用方法: 打桩,用一个函数A去替换函数B,B是原函数,A就是打桩函数

    //target是原函数,被替换的函数,replacement是需要打桩的函数
    func Patch(target,replacment interface{})*PatchGuard{}
    //打桩结束后卸载掉
    func Unpatch(target interface{})bool{}
    
  4. 基准测试

    测试程序的运行性能和CPU的资源消耗程度,使用方法类似于单元测试。

    测试函数为 func BenchmarkXxx(b *testing.B){ }

    支持并行测试func BenchmarkXxxxParallel(){ }

    tips: 高性能随机数fastrand,对并发支持较好,但牺牲了一定的数列一致性,大多数场景适用 github.com/bytedance/g…

项目实践

  1. 需求分析

    面向对象,分析涉及元素实体,实体属性及联系;ER图

  2. 项目设计

    分层结构

    数据层repository,数据Model,封装外部数据的增删改查;

    逻辑层service,业务Entity,接受数据层数据,处理核心业务逻辑输出;

    视图层controller,视图View,处理和外部的交互逻辑,封装数据格式;

  3. 组件工具

    go web框架 Gin github.com/gin-gonic/g…

    go get gopkg.in/gin-gonic/gin.v1@v1.3.0

  4. 业务实现

    从下至上

    repository 构建相关结构体,话题和回帖,实现对应相关操作,查询。 sync.Once 适合高并发场景下只执行一次的场景,单例模式,减少存储的浪费;

    service 定义实体,页面信息
    实现逻辑:参数校验,准备数据,组装实体 可并行处理

    controller 构建view对象,处理业务错误码

    最后,通过gin搭建web框架。初始化数据索引,初始化引擎配置,构建路由,启动服务,运行测试

总结

老师在项目实践中对项目进行拆解,引导我们分析设计代码,最后测试运行,跑通了整个的项目流程,学到了后期实现项目的开发思路。