测试+项目流程
- 1. 测试的类别
- 2. 单元测试的规则(函数以Test开头)
- 2.1 示例1
- 2.2 示例2
- 3. Mock测试(打桩)
- 4. 基准测试(类似于单元测试,函数以Benchmark开头)
- 5. 项目开发的流程
- 项目拆解
- 代码设计
- 测试运行
1. 测试的类别
回归测试:使用APP,如刷抖音看评论
集成测试:对功能维度进行自动化测试
单元测试:对单独的函数、模块做验证
以上三个:测试成本下降,覆盖率上升
2. 单元测试的规则(函数以Test开头)
命名:所有的测试文件以_test.go结尾
函数名:func TestXxx(*testing.T)
初始化逻辑:
func TestMain(m *testing.M){
//测试前:数据装载、 配置初始化等
code:=m.Run()
//测试后:释放资源等
os.Exit(code7777776)
}
2.1 示例1
package main
import "testing"
func HelloTom() string {
return "Jerry"
}
func TestHelloTom(t *testing.T) {
output := HelloTom()
expectOutput := "Tom"
if output != expectOutput {
t.Errorf("Expected %s do not match actual %s", expectOutput, output)
}
}
func main() {
testing.Main(func(pat, str string) (bool, error) { return true, nil }, []testing.InternalTest{{"TestHelloTom", TestHelloTom}}, []testing.InternalBenchmark{}, []testing.InternalExample{})
}
2.2 示例2
package main
import (
"testing"
"github.com/stretchr/testify/assert"
)
func HelloTom() string {
return "Tom"
}
func TestHelloTom(t *testing.T) {
output := HelloTom()
expectOutput := "Tom"
assert.Equal(t, expectOutput, output)
}
func main() {
testing.Main(func(pat, str string) (bool, error) { return true, nil }, []testing.InternalTest{{"TestHelloTom", TestHelloTom}}, []testing.InternalBenchmark{}, []testing.InternalExample{})
}
单元测试覆盖率:50%~60%,较高80%
3. Mock测试(打桩)
处理文件(如改变数据库)后,可能原本依赖的输入不正确了,程序也就不能运行了。为了避免这个问题,进行Mock打桩。Go语言中有很多第三方库提供了 mock 功能,例如Monkey这个库,可以简单地利用Patch将函数的运行地址替换成原来的,最后Unpatch替换回来。保证单元测试的稳定性。例如:
package main
import (
"fmt"
"github.com/bouk/monkey"
)
func main() {
// 要替换的函数
originalFunction := func() string {
return "Hello, World!"
}
// 替换函数
patch := monkey.Patch(originalFunction, func() string {
return "Goodbye, World!"
})
defer patch.Unpatch()
fmt.Println(originalFunction())
// 输出: Goodbye, World!
}
在这个例子中,我们使用了 monkey 库中的 Patch 函数来替换 originalFunction 函数,并在最后使用 Unpatch 函数来撤销替换。在这个例子中,替换后的函数将总是返回 “Goodbye, World!”。
4. 基准测试(类似于单元测试,函数以Benchmark开头)
性能分析(如服务器负载均衡中使用到了rand函数,测试时使用串行测试和并行测试效率不同。若用fastrand函数代替rand函数,发现性能有巨大提升。)本地跑一跑。
5. 项目开发的流程
项目拆解
首先明确需求;
然后作ER图(明确各主体的各个属性);
然后进行分层结构的设计,如数据层、逻辑层、视图层
代码设计
根据各个层进行代码的实现。