讨论了不同种类的测试,包括回归测试,集成测试,单元测试,和基准测试。其中详细讨论了单元测试的重要概念和指标,格式要求,和mock函数。
在青训营的课件基础上补充了更多信息,用我能理解的方式记录
测试
从上到下:覆盖率逐层变大,成本逐层变低
- 回归 Regression test
- 集成 Integration test
- 单元 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函数的作用:模拟系统中的某些部分,而不受外部环境的影响(不稳定、难以控制或者难以构建的组件),以此来隔离代码并提高测试的可预测性和可控性
函数打桩就是在测试中用模拟特定的行为替代它的实际实现,而不是使用原始的函数逻辑:
- 返回固定值:将被测函数的实现替换为返回一个固定的值,以模拟特定情况下的结果
- 引发异常:将被测函数的实现替换为引发一个异常,以测试代码对异常的处理方式
- 模拟函数调用:在测试中使用模拟函数来模拟另一个函数的行为,以避免实际的函数调用
- 记录函数调用:记录被调用函数的调用次数、参数等信息,以便在测试中验证函数的使用情况
有mock函数的情况下,我们就可以不用引用原函数的逻辑,只用针对特定情况来debug/调试了
monkey开源测试库: github.com/bouk/monkey
基准测试 Benchmarking
- 测试性能(特别是不同输入下的),cpu耗费程度
- 用
testing包的Benchmark实现,也需要写case - 可以帮助在不同优化策略之间进行选择