课程目录
- 语言进阶
- 依赖管理
- 测试
- 项目实战
测试
测试是避免事故的最后一道屏障,只要我们做好完备的测试,就可以避免事故的发生。
测试一般分为,回归测试、集成测试和单元测试。回归测试一般是同学手动通过终端回归一些固定的主流程场景。集成测试是对系统功能维度做测试验证;而单元测试测试开发阶段,开发者对单独的函数、模块做功能验证,层级从上至下,测试成本逐渐减低,测试覆盖率逐步上升,所以单元测试的覆盖率一定程度上决定代码的质量。
单元测试
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。简单说,就是将测试用例的运行结果与预期结果进行比较。
单元测试主要包括,输入,测试单元,输出,以及校对,单元的概念比较广,包括接口,函数,模块等;用最后的校对来保证代码的功能与我们的预期相符;单侧一方面可以保证质量,在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正确性,又未破坏原有代码的正确性。另一方面可以提升效率,在代码有bug的情况下,通过编写单测,可以在一个较短周期内定位和修复问题。
Go有testing测试包,配合go test命令能够进行单元测试。
- 测试文件以_test.go结尾
- 在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中
- _test.go文件包含TestXxx函数
- 形参类型必须为*test.T
- PASS表示测试用例运行成功,FAIL表示失败
举例子,在package main里定义一个函数Add,求两个数之和的函数,然后我们使用单元测试进行求和逻辑测试。
main.go
func Add(a,b int) int{
return a+b
}
main_test.go
func TestAdd(t *testing.T) {
sum := Add(1,2)
if sum == 3 {
t.Log("the result is ok")
} else {
t.Fatal("the result is wrong")
}
}
然后在终端的项目目录下运行go test -v就可以看到测试结果了。
➜ hello go test -v
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
main_test.go:26: the result is ok
PASS
ok flysnow.org/hello 0.007s
有测试成功PASS标记,并且打印出我们想要的结果。
Tips:
- 一般要求覆盖率:50%-60%,较高覆盖率80%+。
- 测试分支相互独立、全面覆盖。
- 测试单元粒度足够小,函数单一职责。