这是我在第六届字节跳动青训营后端进阶班的第六篇笔记,主要梳理Go语言工程测试课程内容。
测试关系着系统的质量,质量就是“生命”,决定线上系统的稳定性,如果出现漏洞会造成事故,所以测试是避免事故的最后一道屏障,是实际工程开发中的一个重要概念。测试包括单元测试规范,Mock测试,以及基准测试。
单元测试
单元测试主要包括输入、测试单元、输出以及校对。
单元的概念比较广,包括接口、函数、模块等;用最后的校对来保证代码的功能与我们的预期相符;单元测试一方面可以保证质量,在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正确性,又未破坏原有代码的正确性。另一方面可以提升效率,在代码有bug的情况下,通过编写单测,可以在一个较短周期内定位和修复问题。
单元测试的基本规范:
- 所有测试文件以_test.go结尾;
- func TestXxx(*testing.T)来区分源码和测试代码;
- 初始化逻辑放到TestMain中。
复杂项目一般会依赖本地文件或数据库、缓存,而单测需要保证稳定性和幂等性:
- 稳定性是指相互隔离,能在任何时间,任何环境,运行测试;
- 幂等性是指每一次测试运行都应该产生与之前一样的结果。
实现这些目的需要用到mock机制。
Mock测试
当单测需要依赖本地的文件时,如果文件被修改或者删除测试就会fail。为了保证测试case的稳定性,可以对读取文件函数进行mock,屏蔽对于文件的依赖。
通常会用到Monkey,Monkey是一个开源的mock测试库,可以对method,或者实例的方法进行mock。
基准测试
Go 语言提供了基准测试框架,基准测试是指测试一段程序的运行性能及耗费 CPU 的程度。在实际项目开发中,经常会遇到代码性能瓶颈,为了定位问题经常要对代码做性能分析,这种情况就会用到基准测试,其使用方法类似于单元测试。