测试
避免事故的最后一道屏障
1.回归测试: 使用终端,使用一些具体的场景来看产品效果如何,是否达到预期
2.集成测试: 对于系统功能性的测试,自动化的测试
3.单元测试: 主要面对开发阶段,对逐个函数进行测试
从上到下,测试的覆盖率逐层上升,但是成本却在逐层下降
单元测试
输入数据,通过一些函数和模块然后输出结果,与我们的期望进行比较,看是否达到预期要求,以此来保障质量和提高效率
单元测试规则
1.所有测试文件都以_test.go结尾
以此来更方便的判断哪些是源代码,哪些是测试代码
2.测试函数命名规范
以func TestXxx(*testing.T)来命名测试函数
3.初始化逻辑放到TestMain中
覆盖率
如果输入的score是70,则会执行前面的两行代码,而return false这一行不会被执行,所以这个代码的覆盖率为66.7%,还需要再另外写一个测试函数,输入score是50,这样会执行return false这一行代码,这样两个测试函数下来,代码的覆盖率就达到了100%
小tips
1.一般覆盖率为50%-60%,较高覆盖率为80%以上
2.测试分支要求独立,全面覆盖
3.测试函数单一职责
依赖外部组件
1.要求满足幂等性: 重复运行一种情况时结果是一样的
2.要求满足稳定性: 单元测试能够相互独立运行
Mock
链接:monkey : github.com/bouk/monkey
快速Mock函数:
1.为一个函数打桩
2.为一个方法打桩
打桩:
参考博客:一文看懂单元测试中的打桩_打桩测试_alibli的博客-CSDN博客
定义: 函数打桩,就是将一个函数用另一个函数实现(桩代码)进行替换,以达到在原有函数入口的位置执行新的实现。
目的: 函数打桩的目的一般是隔离、占位和控制。
- 隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行
- 占位就是用桩对一些未实现的函数进行占位
- 控制是指在测试时,人为设定相关代码的行为,使之符合测试需求。
方法: 编译时,链接时,运行时
- 编译时:用宏定义
#define,在预处理时进行字符串替换,将原函数定义成桩函数的形式。 - 链接时:链接时打桩就是调用的函数库替换。
- 运行时:运行时打桩就是函数地址替换。
基准测试
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力
基准测试以Benchmark为前缀,需要一个testing.B类型的参数b
基准测试并不会默认执行,需要增加-bench参数,所以我们通过执行go test -bench=Split命令执行基准测试
参考博客:go语言的性能基准测试、性能优化测试和性能调优_go 基准测试_ydl1128的博客-CSDN博客
小结
本篇文章主要是关于工程实践中测试的部分,几乎所有东西都是新学的,学起来也是相当吃力,只能尽可能的写一些相关笔记,主要是学习了如何在工程项目中中测试相关的代码和函数功能,来保障代码的安全性,使功能得到保障,尽可能提高代码的覆盖率,这样可以减少bug的出现,后面打算继续再写一些工程实践相关的笔记