单元测试

测试

在开发过程中,往往需要对某个方法或模块做功能测试和验证。在golang中内置了用于进行代码单元测试的包testing

首先,对于需要测试的代码文件,在相同目录下创建一个同名带_test.go后缀的文件,比如代码文件a.go和单元测试文件a_test.go。在单元测试文件中,引入包testing,在下方定义以需要验证的方法名加Test前缀,形式参数为*testing.T的单元测试方法,比如需要测试方法B(),则对应的单元测试方法为TestB(*testing.T),*testing.T可以在测试过程中输出测试结果或者是报错中断测试。

例子:方法单元测试

a.go
package unittest

func Add(x, y int) int {
	return x + y
}

func Sub(x, y int) int {
	return x - y
}
a_test.go
package unittest

import (
	"testing"
)

func TestAdd(t *testing.T) {
	if Add(1, 2) != 3 {
		t.Error("error result of func A()")
	} else {
		t.Log("ok")
	}
}

func TestSub(t *testing.T) {
	if Sub(1, 2) != -1 {
		t.Error("error result of func Sub()")
	} else {
		t.Log("ok")
	}
}

运行命令go test -v执行单元测试,-v参数表示打印测试过程中输出的日志(查看更多的参数请使用go test -h

测试结果输出如下:

如果当前目录中有多个单元测试文件可以使用go test -v .指定执行当前目录下的所有测试文件。

单元测试文件需要遵循以下规则:

  • 文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码;

  • 必须导入 testing包;

  • 所有的测试用例函数必须是Test开头;

  • 测试用例会按照代码的书写顺序依次执行;

  • 测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是测试状态;

  • 测试方法格式:func TestXxx (t *testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母必须是大写;

  • 函数中通过调用testing.TError, Errorf, FailNow, Fatal, FatalIf方法,说明测试不通过,调用Log方法用来记录测试的信息。

接口测试

覆盖率

方法中往往带有许多的条件判断,在不同的测试条件下,测试的结果各不相同。为了保证测试代码的质量,需要尽可能多的覆盖测试方法中的各种条件,而代码的测试覆盖率可做为评估单元测试测试质量的一个依据。

在测试命令中附加参数-cover开启代码覆盖率统计

例子:代码覆盖率检查

创建目录$GOPATH/src/demo/coverage/,分别创建代码文件action.go和测试文件action_test.go

执行命令

测试结果

默认情况下只会检查_test.go文件中引用到的包,通过附加参数-coverpkg {包名1},{包名2},...可以指定需要检查覆盖率的包。

覆盖率检查可以生成可视化的测试报告,首先在测试的时候附加参数-coverprofile=coverage.data,将代码覆盖报告输出到coverage.data中,再通过命令go tool cover -html=coverage.data -o coverage.html根据覆盖报告生成一个html文件

执行命令

通过浏览器打开生成的html文件即可查看代码覆盖情况

最后更新于