测试的分类
- 从细微到整体可以分为:单元测试、集成测试、回归测试
- 从覆盖率从大到小可以分为:单元测试、集成测试、回归测试
里面的工作到底是做什么的,下面一一讲解:
- 单元测试:开发人员在开发阶段对自己写的函数、接口、模块等做测试
- 集成测试:对系统功能维度做测试验证
- 回归测试:QA人员手动通过终端回归一些固定的主流程场景
单元测试
测试覆盖率
- 定义:测试所运行代码的语句占所写的代码语句的百分比,尽量让覆盖率达到80%,这样才能说明我们的测试代码质量更高
- 小tips
-
- 测试粒度足够小,函数单一负责
-
- 测试分支相互独立,全面覆盖
func IfNumber(num int) int {
return 10
}
func main() {
t := IfNumber(10)
if t < 10 {
println("None") //这个不执行
}
else {
println("OK")
}
}
代码覆盖率100%,如果num = 1,则代码覆盖率66.7%
依赖
在单元测试中,会对文件、数据库、还有缓存有一定的依赖。依赖会影响测试的稳定性和幂等因此我们在测试中要摆脱这种依赖,需要用到Mock测试。
幂等指的是每次执行都能得到一致的结果
稳定是测试不受环境
例子:当我们测试读取文件相关的模块时,如果文件被删除或者修改,会影响测试的幂等、稳定。
Mock测试
- 定义:Mock对象可以模拟依赖组件的行为,使得测试更加独立和可控。
- 使用Mock测试的好处包括:
- 隔离依赖:通过使用Mock对象,我们可以隔离被测试对象与其依赖组件之间的耦合,确保测试的独立性。
- 提高测试效率:有些依赖组件可能需要耗费较长的时间或资源才能初始化或执行,使用Mock对象可以避免这些开销,提高测试效率。
- 模拟异常情况:通过设置Mock对象的行为,我们可以模拟一些异常情况,以验证被测试对象的错误处理能力。
Mock打桩
详细说明可以看看这篇文章 干货!用大白话告诉你什么是Mock测试。
在使用 mock 进行接口测试时,一般要做两件事情,即打桩和调桩。
其实打桩就是创建mock 桩,指定 API 请求内容及其映射的 mock 响应内容;所谓调桩就是被测服务来请求 mock 桩并接收 mock 响应。
Monkey是一个开源的mock测试库,它可以重写可执行的函数,并且替代原来的函数,一般的写法是monkey.Patch(<target function>, <replacement function>),推荐在测试环境中使用,不然会不安全。
下面举一个例子,首先需要import相关的包进来
package main
import (
"fmt"
"os"
"strings"
"bou.ke/monkey"
)
接着编写函数或者方法
func main() {
monkey.Patch(fmt.Println, func(a ...interface{}) (n int, err error) {
s := make([]interface{}, len(a))
for i, v := range a {
s[i] = strings.Replace(fmt.Sprint(v), "hell", "*bleep*", -1)
}
return fmt.Fprintln(os.Stdout, s...)
})
fmt.Println("what the hell?") // what the *bleep*?
}
基准测试
基准测试是一种用于评估系统性能的测试方法。通过基准测试,我们可以测量系统在特定负载下的响应时间、吞吐量、资源利用率等指标,从而找到系统的瓶颈和优化空间。
写法
func BenchmarkXxx(*testing.B)