这是我参与「第五届青训营 」笔记创作活动的第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选项来执行。多个基准测试按照顺序运行。