后端go笔记5: 测试 | 青训营

78 阅读2分钟

讨论了不同种类的测试,包括回归测试,集成测试,单元测试,和基准测试。其中详细讨论了单元测试的重要概念和指标,格式要求,和mock函数。

在青训营的课件基础上补充了更多信息,用我能理解的方式记录

测试

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

  1. 回归 Regression test
  2. 集成 Integration test
  3. 单元 Unit test

回归测试 Regression test

测试在进行了修改之后,之前已经测试过的功能(也就是重跑一遍cases)是否继续正确;以防在加入新代码之后有意料以外的bug

集成测试 Integration test

测试多个组件或模块的集成是否能够正确地协同工作(验证整体系统的功能一致性);但是这样难以确认问题出在哪里

单元测试 Unit test

保证新旧代码互不影响,程序能正常进行;保证代码质量的基础

覆盖率

  • 一般: 50-60; 较高: >80%
  • 单元粒度足够小

单元测试的两个重要指标

  • 幂等:重复运行的结果一致
  • 稳定:unit test可以独立运行,相互隔离

格式要求(MANDATORY):

  • 文件名: xx_test.go
  • func: Test[^a-z]开头
  • func parameter: t *testing.T
  • 初始化逻辑在main
  • go test <go testing filename> <go filename> --cover来执行unit test (会显示覆盖率)

跟c一样,可以用assert.Equal(t, a, b)判断a和b是否一致

Mock函数:

Mock函数的作用:模拟系统中的某些部分,而不受外部环境的影响(不稳定、难以控制或者难以构建的组件),以此来隔离代码并提高测试的可预测性和可控性

函数打桩就是在测试中用模拟特定的行为替代它的实际实现,而不是使用原始的函数逻辑:

  1. 返回固定值:将被测函数的实现替换为返回一个固定的值,以模拟特定情况下的结果
  2. 引发异常:将被测函数的实现替换为引发一个异常,以测试代码对异常的处理方式
  3. 模拟函数调用:在测试中使用模拟函数来模拟另一个函数的行为,以避免实际的函数调用
  4. 记录函数调用:记录被调用函数的调用次数、参数等信息,以便在测试中验证函数的使用情况

有mock函数的情况下,我们就可以不用引用原函数的逻辑,只用针对特定情况来debug/调试了

monkey开源测试库: github.com/bouk/monkey

基准测试 Benchmarking

  • 测试性能(特别是不同输入下的),cpu耗费程度
  • testing包的Benchmark实现,也需要写case
  • 可以帮助在不同优化策略之间进行选择