简单整两句
Golang的单元测试编写约束与Go语言本身一样简洁,仅仅需要注意两点:
- 测试源码文件以_test结尾:xxx_test.go;
- 测试方法名以Test开头:TestXXX(t *testing.T) {…};
- 没了。。。。。。
上代码,自己体会:
功能代码:(hello.go)
package hello
func Sum(a int, b int) int {
return a+b
}
测试用例代码:(hello_test.go)
package hello
import "testing"
func TestHello (t *testing.T) {
var a int = 1
var b int = 1
var expectedResult int = 2
ret := Sum(a, b)
if ret != expectedResult {
t.Error("expected 2, but x actually!!!")
}
}
两个源码文件在同一个目录下:
$ ls hello
hello.go hello_test.go
运行这段测试代码:
$ go test -v
=== RUN TestHello
--- PASS: TestHello (0.00s)
PASS
ok hello 0.469s
如果修改变量a的值为2,再运行这段测试代码:
$ go test -v
=== RUN TestHello
--- FAIL: TestHello (0.00s)
hello_test.go:15: expected 2, but x actually!!!
FAIL
exit status 1
FAIL hello 0.540s
表格测试法
上面的测试代码里,我们仅仅输入了一组测试数据,在实际应用中,通常会输入一组数据进行测试,并判断输入后的功能函数输出是不是符合预期。
上代码:
//functions.go
package testing
func square(op int) int {
return op * op
}
//functions_test.go
package testing
import (
"testing"
)
func TestSquare(t *testing.T) {
inputs := [...]int{1, 2, 3}
expected := [...]int{1, 4, 9}
for i := 0; i < len(inputs); i++ {
ret := square(inputs[i])
if ret != expected[i] {
t.Errorf("input is %d, the expected is %d, the actual %d",
inputs[i], expected[i], ret)
}
}
}
测试代码这样编写后,我们就可以将输入的测试数据和预期的值存储在Excel表格或者xml文件中,然后在测试代码中遍历这些不同的输入参数进行测试。
注意事项:
在TestSquare函数中,使用了t.Error函数打印错误日志。
这里有一个需要注意的地方,除了使用t.Error函数外,还可以使用t.Fatal函数。二者区别如下:
t.Error函数打印错误信息后,当前测试用例还会继续运行,不会影响其他用例的执行。
t.Fatal函数打印错误信息,当前测试用例会终止,不会影响其他用例的执行。
代码覆盖率统计
代码覆盖率是衡量单元测试用例充分且完备的有效指标,在Go语言中,可以很方便的统计单元测试的代码覆盖率。
使用-cover参数执行测试用例:
$ go test -v -cover
=== RUN TestSquare
--- PASS: TestSquare (0.00s)
coverage: 100.0% of statements
exit status 1
FAIL hello 0.321s
这里的测试代码和测试用例都比较简单,结果显示代码行覆盖率是100%。如果你使用的是atom这样的IDE,运行测试代码时候会自动使用-cover来运行测试用例。
断言
如果你原来使用的是Java这样的开发语言,很可能会习惯使用断言。
在Github上,也有比较好用的开源项目来支持断言。
首先需要安装一下:
$ go get -u github.com/stretchr/testify/assert
然后在functions_test.go中导入这个包:
import "github.com/stretchr/testify/assert"
然后在functions_test.go中加入对应的测试代码:
func TestSquareWithAssert(t *testing.T) {
inputs := [...]int{1, 2, 3}
expected := [...]int{1, 4, 9}
for i := 0; i < len(inputs); i++ {
ret := square(inputs[i])
assert.Equal(t, expected[i], ret)
}
}
这里使用了assert.Equal函数完成断言。