Go语言测试 | 青训营笔记

76 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第3天

单元测试

testing是Go语言的一个Package,它提供自动化测试功能,通过 go test 命令能够自动执行如下形式的函数:

func TestXxx( *testing .T)

其中 Xxx 可以是任何字母、数字、字符串,但是 Xxx 的第一个字母不能是小写字母(即对外可访问)。 在这些函数中,使用 Error、Fail或相关方法来返回失败信号。 要编写个新的测试模块,需要创建个名称以 _test.go 结尾的文件,该文件包含 TestXxx 函数,最后将该文件放在与被测试的包相同的包目录中 。该文件将被排除在正常的程序包之外,但在运行go test命令时将被调用。运行go help test 或go help testflag可以了解更详细的信息。

例子

./02_testing/test01/test01.go

要测试的代码如下,下面的Age函数中,如果输入的参数值小于0则返回0,如果输入大于0则返回相应数值:


func Age(n int) int {
	if n > 0 {
		return n
	}
	n = 0
	return n
}

测试代码如下所示,现在测试的是如果输入小于0的数字,程序是否会返回相应的数字: ./02_testing/test01/test01_test.go


import "testing"

func TestAge(t *testing.T) {
	var (
		input   = -100
		exected = 0
	)
	actual:=Age(input)
	if actual!=exected {
		t.Errorf("Age(%d) = %d, 预期为 %d",input,actual,exected)
	}
}

执行测试命令:

go test ./02_testing

结果

$ go test ./02_testing/test01
ok      go.standard.library.study/02_testing    (cached)

这时候如果我们把Age函数修改了,当输入的参数小于0的时候,应该返回-1,测试函数不动,我们可以看到:

--- FAIL: TestAge (0.00s)
    test01_test.go:12: Age(-100) = -1, 预期为 0
FAIL
FAIL    go.standard.library.study/02_testing/test01     0.022s
FAIL

mock测试

单元测试的原则,就是你所测试的函数方法,不受依赖环境的影响,比如网络访问等。但有时候运行单元测试的时候需要联网,而由于开发环境限制,不能联网,此时就需要进行模拟网络访问来完成测试了。

基准测试

基准测试(benchmarking)是一种测量和评估软件性能指标的活动。在某个时候通过基准测试建立一个已知的性能水平(称为基准线),当系统的软硬件环境发生变化之后再进行一次基准测试,以确定那些变化对性能的影响,这是基准测试最常见的用途。其他用途包括测定某种负载水平下的性能极限,管理系统或环境的变化、发现可能导致性能问题的条件等。

在_test.go结尾的测试文件中,如下形式的函数(基准测试的函数必须以 Benchmark (基准)开头,必须是可导出的:

func BenchmarkXxxx(*testing.B)

被认为是基准测试,通过go test命令,加上-bench选项来执行。多个基准测试按照顺序运行。