golang中的单元测试主要使用golang的内建测试指令go test和testing包来实现。
待测试文件
先编写一个简单的待测试文件functions.go,主要包含两个待测试的功能函数square和addOne:
package unittest
func square(i int) int {
return i * i
}
func addOne(i int) int {
return i + 1
}
单测文件
首先单测文件的名字一般都是待测试文件名字后加“_test”,因此我们的单测名字就叫作functions_test.go;
单测文件中函数名称以Test开头,紧接着以大写字母开头的单词或短语(一般为待测试的函数名称);
测试函数的参数必须是参数必须是t *testing.T;
这里的单测文件编写如下:
package unittest
import (
"testing"
)
func TestSquare(t *testing.T) {
inputs := [...]int{1,2,3}
expects := [...]int{1,4,9}
for i:=0;i<len(inputs);i++ {
res := square(inputs[i])
if res != expects[i] {
t.Errorf("input is %d, expected is %d, actual is %d", inputs[i], expects[i], res)
}
}
}
注:
- 代码中的t.Errorf()函数用于在测试时输出一些信息,类似的函数及用法:
Fail,Error: 失败,该测试继续,其它测试继续
FailNow,Fatal: 失败,该测试中止,其它测试继续
Log: 打印信息 - 其它还有一些函数:
SkipNow: 跳过当前测试
Skiped: 检测是否跳过 - 这里只测试了两个待测函数中的一个;
- 这里用的是表格测试法;
进行测试
在单测文件所在目录下执行go test命令,输出:
PASS
ok aboutGo/unitTest 0.005s
也可以使用go test -v,输出更详细的测试信息:
=== RUN TestSquare
--- PASS: TestSquare (0.00s)
PASS
ok aboutGo/unitTest 0.005s
还可以使用go test -v -cover查看覆盖率:
=== RUN TestSquare
--- PASS: TestSquare (0.00s)
PASS
coverage: 50.0% of statements
ok aboutGo/unitTest 0.005s
这里的覆盖率只有0.5,因为我们只测了一个函数,如果补齐另一个函数的测试:
package unittest
import (
"testing"
)
func TestSquare(t *testing.T) {
inputs := [...]int{1, 2, 3}
expects := [...]int{1, 4, 9}
for i := 0; i < len(inputs); i++ {
res := square(inputs[i])
if res != expects[i] {
t.Errorf("input is %d, expected is %d, actual is %d", inputs[i], expects[i], res)
}
}
}
func TestAddOne(t *testing.T) {
inputs := [...]int{1, 2, 3}
expects := [...]int{2, 3, 4}
for i := 0; i < len(inputs); i++ {
res := addOne(inputs[i])
if res != expects[i] {
t.Errorf("input is %d, expected is %d, actual is %d", inputs[i], expects[i], res)
}
}
}
再执行 go test -v -cover命令:
=== RUN TestSquare
--- PASS: TestSquare (0.00s)
=== RUN TestAddOne
--- PASS: TestAddOne (0.00s)
PASS
coverage: 100.0% of statements
ok aboutGo/unitTest 0.005s
另外注意这里的覆盖率是语句的覆盖率,而不是测试结果正确性的覆盖率。
还有一个命令,go test aboutGo/unitTest -run TestSquare,可以在任意其他目录执行该单测。命令中两个参数的前者是该单测文件在$GOPATH/src下的位置,后者也就是-run的参数是具体要执行的测试函数,当然也可以不指定,这样整个测试文件都会执行。
以上命令后都可以加参数 -timeout 30s,数字自定,设定时间内没有执行完毕会panic。