Go语言测试 | 青训营笔记

97 阅读3分钟

测试

测试一般分为三种类型:回归测试、集成测试 和 单元测试。

  • 回归测试 一般是 QA 同学手动通过终端回归一生固定的主流程场景,
  • 集成测试 是对系统功能维度做测试验证,
  • 单元测试 测试开发阶段,开发者对单独的函数、模块做功能验证

层级从上至下,测试成本逐渐减低,而测试覆盖率确逐步上升,所以单元测试的覆盖率一定程度上决定这代码的质量。

3.1 单元测试

img.png
单元测试主要包括 输入测试单元输出 以及 校对
单元的概念比较广泛,包括接口函数模块等。用最后的校对来保证代码的功能与我们的预期相符;
通过单元测试

  • 一方面可以保障质量, 即在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正准性,又没有破坏原有代码的正确性。

  • 另一方面可以提升效率,在代码有 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

  • 提高测试覆盖率的技巧:测试分支相互独立、全面覆盖

  • 开发应保证:测试单元粒度足够小,函数单一职责

3.2 Mock测试

推荐文章

3.3 基准测试

推荐文章