单元测试是指,是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,如C语言中指一个函数,Java中指一个类,图形化软件中指一个窗口或菜单等。总的来说,单元是认为规定的最小可测试功能模块,单元测试是在软件开发过程中要进行的最低级别测试活动,独立单元与程序的其他部分相隔离情况下测试。
1. 注意点
-
go单元测试源文件必须以
_test.go
结尾,自动执行其中所有以func TestXXX(t *testing.T)
开头的函数 -
一个单元测试文件可以包含多个测试用例函数
func TestXXX(t *testing.T)
,作为测试入口 -
测试用例不会参与正常编译,不会包含到可执行文件中
-
使用
go test
来执行测试用例,没有也不需要main()函数作为程序入口 -
测试用例函数可以不传入*testing.T参数
-
使用t.Log()打印字符串
package helloworld
import "testing"
func TestHelloWorld(t *testing.T) {
t.Log("hello world")
}
2. 单元测试命令行
// 执行单元测试文件中所有的测试用例(函数),-v表示可视化
# go test -v helloworld_test.go
=== RUN TestHelloWorld // 运行TestHelloWorld测试用例函数
hello world
--- PASS: TestHelloWorld (0.00s)
PASS // 测试成功
ok command-line-arguments 0.006s
// 测试通过,command-line-arguments是测试用例需要用到的一个包名,0.006s表示测试用时
3. 运行指定单元测试用例
(go test -v -run TestXXX XXX_test.go)
go test默认执行go测试源文件的所有测试用例,可以使用-run参数选择执行指定的测试用例。
package go_test
import "testing"
func TestA(t *testing.T) {
t.Log("A")
}
func TestAK(t *testing.T) {
t.Log("AK47")
}
func TestB(t *testing.T) {
t.Log("B")
}
func TestC(t *testing.T) {
t.Log("C")
}
测试用例TestA和TestAK都被执行,原因是-run跟随的测试用例名称支持正则表达式。使用-run TestA$可以只执行TestA测试用例。
# go test -v -run TestA select_test.go
=== RUN TestA
--- PASS: TestA (0.00s)
select_test.go:6: A
=== RUN TestAK
--- PASS: TestAK (0.00s)
select_test.go:10: AK47
PASS
ok command-line-arguments 0.006s
4. 标记单元测试结果
使用t.FailNow()终止当前测试用例。
func TestFailNow(t *testing.T) {
t.FailNow()
}
使用t.Fail()只标记错误,不终止单元测试
func TestFail(t *testing.T) {
fmt.Println("before fail")
t.Fail()
fmt.Println("after fail")
}
5. 单元测试日志
单元测试可能并发执行,有必要跟踪打印这个测试上下文的输出。
方法 | 备注 |
---|---|
t.Log | 打印日志,同时结束测试 |
t.Logf | 格式化打印日志,同时结束测试 |
t.Error | 打印错误日志,同时结束测试 |
t.Errorf | 格式化打印错误日志,同时结束测试 |
t.Fatal | 打印致命日志,同时结束测试 |
t.Fatalf | 格式化打印致命日志,同时结束测试 |