Go语言工程实践之测试(实践文章) | 青训营

74 阅读2分钟

测试

01.测试

测试可以分为三种,第一种是单元测试,第二种是集成测试,第三种是回归测试。回归测试是回归到终端的一种主流场景去进行测试,例如抖音的回归测试就是刷一下抖音,看一下评论这种测试。集成测试就是对于功能的集成测试,将各个功能联合起来进行测试。单元测试是面对开发阶段,开发者对某单个函数进行功能验证测试。

单元测试成本最低,覆盖率广,在一定程度上决定着开发内容的好坏。集成测试成本中等,覆盖率中等。回归测试成本最高,覆盖率最低。

02.单元测试

单元测试流程主要是输入->单元测试->输出,最后的输出结果与预期结果进行比较。单元测试中可以是测试一个函数,也可以是一个模块等等。经过单元测试可以提高代码的质量和运行的效率。

规则:

image.png

实践:

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)  
    }  
}

输出结果:

image.png

assert

package main  
  
import (  
    "github.com/stretchr/testify/assert"  
    "testing"  
)  
  
func HelloTom() string {  
    return "Tom"  
}  
func TestHelloTom(t *testing.T) {  
    output := HelloTom()  
    expectOutput := "Tom"  
    assert.Equal(t, expectOutput, output)  
}

03.单元测试-覆盖率

在我们进行单元测试时需要考虑以下问题:

1.如何衡量代码是否经过了足够的测试?

2.如何评价项目的测试水准?

3.如何评估项目是否达到了高水准测试等级?

单元测试的主要评估标准是代码覆盖率,覆盖率越高则证明越多的代码经过了测试。

首先创建demo3.go,其中编写了一个判断分数是否及格的功能。

package main func judgePass(score int) bool { 
    if score >= 60 { 
        return true 
    } 
    return false 
}

生成测试文件demo3_test.go,调用 judgePass 并传入一个70,将结果与true校对。

package main

import (
	"github.com/stretchr/testify/assert"
	"testing"
)

func Test_judgePass(t *testing.T) {
	isPass := judgePass(70)
	assert.Equal(t, true, isPass)
}

然后运行带有覆盖率(coverage)的测试。可以用命令单独测试某个模块(如demo3.go):

go test demo3_test.go demo3.go --cover

也可以在GoLand直接操作,点击右上角的run with coverage进行测试。测试工具会自动运行测试用例,并在执行过程中跟踪被执行的代码行数。最后,它会计算测试覆盖率并给出结果。(注意,这样执行的是该目录下的所有测试文件,给出的也是整个包的测试覆盖率结果。)