测试
测试一般分为三种类型:回归测试、集成测试 和 单元测试。
- 回归测试 一般是 QA 同学手动通过终端回归一生固定的主流程场景,
- 集成测试 是对系统功能维度做测试验证,
- 单元测试 测试开发阶段,开发者对单独的函数、模块做功能验证
层级从上至下,测试成本逐渐减低,而测试覆盖率确逐步上升,所以单元测试的覆盖率一定程度上决定这代码的质量。
3.1 单元测试

单元测试主要包括 输入、测试单元、输出 以及 校对。
单元的概念比较广泛,包括接口、函数、模块等。用最后的校对来保证代码的功能与我们的预期相符;
通过单元测试
-
一方面可以保障质量, 即在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正准性,又没有破坏原有代码的正确性。
-
另一方面可以提升效率,在代码有 bug 的情况下,通过编写单元测试。可以在一个较短周期内定位和修复问题。
3.1.1 单元测试 —— 规则
单元测试的一些基本规范,这样能从文件上很好地区分源代码和测试代码。
- 所有的测试文件以
_test.go结尾 - 测试函数的定义形式:
func TestXxx(*testing.T)。 - 初始化逻辑放入到
TestMain函数中,函数的入参为(m *testing M),逻辑代码如下:
命名必须规范,否则可能连测试代码都运行不起来
func TestMain(m *testing M){
//测试前:数据装载、配置初始化等前置工作
code:=m.run()
//测试后:释放资源等收尾工作
os.Exit(code)
}
3.1.2 单元测试 —— assert
用开源的 assert 包的 Equal 方法代替 !=符号。例如 helloTom_pro 的单元测试
3.1.3 单元测试 —— 覆盖率
了解单元测试的规范和写法,需了解以下几个问题:
- 如何衡量代码是否经过了足够的测试?
- 如何评价项目的测试水准?
- 如何评估项目是否达到了高水准测试等级?
单元测试的评估 —— 代码覆盖率。见用例 JudgePass ——判断是否及格的例子
package main
func JudgePassLine(score int16) bool {
if score >= 60 {
return true
}
return false
}
package main
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestJudgePassLineTrue(t *testing.T) {
isPass := JudgePassLine(70)
assert.Equal(t, true, isPass)
}
用以下方式得出代码测试覆盖率:
go test .\JudgePassLine_test.go .\JudgePassLine.go --cover
ok command-line-arguments 0.800s coverage: 66.7% of statements
66.7%的得来:函数被执行成功了多少、验证过的代码的比率
测试代码中再增加一个测试Fail的函数TestJudgePassLineFalse进行测试,即可达到100%
package main
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestJudgePassLineTrue(t *testing.T) {
isPass := JudgePassLine(70)
assert.Equal(t, true, isPass)
}
func TestJudgePassLineFalse(t *testing.T) {
isPass := JudgePassLine(50)
assert.Equal(t, false, isPass)
}
3.1.5 单元测试-Tips
-
一般覆盖率50-60,较高80
-
提高测试覆盖率的技巧:测试分支相互独立、全面覆盖
-
开发应保证:测试单元粒度足够小,函数单一职责