这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
测试
测试一般分为:回归测试、集成测试、单元测试。
- 回归测试一般是手动通过终端回归一些固定的主流程场景;
- 集成测试是对系统功能维度做测试验证;
- 而单元测试测试开发阶段,开发者对单独的函数、模块做功能验证。
层级从上至下,测试成本逐渐减低,而测试覆盖率却逐步上升,所以单元测试的覆盖率一定程度上决定着代码的质量。
单元测试
单元测试一方面可以保证质量,在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正确性,又未破坏原有代码的正确性;另一方面可以提升效率,在代码有bug的情况下,通过编写单元测试,可以在一个较短周期内定位和修复问题。
1. 单元测试规则
- 所有测试文件以
_test.go结尾,如源代码文件为:hello.go,则测试文件取名为:hello_test.go - 测试方法名规定为:
func TestXxx(*testing.T),如:func TestPublishPost(t *testing.T){ pass } - 初始化逻辑放到TestMain中
func TestMain(m *testing.M){ // 测试前:数据装载,配置初始化等前置工作 code := m.Run() // 测试后:释放资源等收尾工作 os.Exit(code) }
2. 覆盖率
命令行输入下面的命令测试覆盖率:
go test XXX.go --cover
3. Mock
假设一种场景:我们的单测需要依赖本地的文件,如果文件被修改或者删除测试就会fail。为了保证测试案例的稳定性,我们对读取文件函数进行mock,屏蔽对于文件的依赖。
4. 基准测试
Go 语言还提供了基准测试框架,基准测试是指测试一段程序的运行性能及耗费CPU的程度。而我们在实际项目开发中,经常会遇到代码性能瓶颈,为了定位问题经常要对代码做性能分析,这就用到了基准测试。使用方法类似于单元测试。