golang自带了testing测试包,使用该包可以进行自动化的单元测试,输出结果验证,并且可以测试性能。
建议安装gotests插件自动生成测试代码:
go get -u -v github.com/cweill/gotests/...
测试文件及目录
使用testing测试包的测试文件名称需要以_test.go
结尾,并且该测试文件需要与待测试的文件置于同一目录下。比如如下目录:
这里需要测试的是service目录中各个文件中的函数,则在该目录中创建一个名为service_test.go的文件,即可在该文件中调用其他文件的函数进行测试。
测试函数
在_test.go中通过编写测试函数来进行测试。
首先引入testing包
import (
"testing"
)
对于测试函数,其命名需要以“Test”开头,并且其后的字符串的第一个字符必须是大写,或者是数字。如果没有按照此规则进行命名,则该函数在测试时不会被执行。
其次,测试函数的参数必须为(t *testing.T),该参数包含有Log和Error等方法,用于输出测试结果,其中Log用于测试通过的情况,Error则用于测试出错的情况。
比如如下测试函数:
func TestUserLogin_normal(t *testing.T) { err := User().Login("test1", "321") if err == nil { t.Log("Login test1 success") } else { t.Error(err) } }
该函数负责测试User().Login()
方法的功能,当其功能正常执行时返回nil
,则调用t.Log()
输出测试通过的信息,否则测试不通过,调用t.Error()
输出错误信息。
执行测试
在测试文件的目录下使用命令go test
即可进行测试。
当直接执行go test时,会默认执行所有"Test"开头的函数,并且执行的顺序与函数定义的顺序相同。
如果需要指定某个函数进行测试,可以在命令后加上-run参数,该参数用于匹配要执行的测试函数的函数名(通过正则表达式来匹配)
比如要单独执行TestUserRegister_normal测试函数时,用以下命令:
go test -run=TestUserRegister_normal
当要执行所有名称前缀为TestUserRegister的测试函数时,用以下命令:
go test -run=TestUserRegister
前置条件:
1、文件名须以"_test.go"结尾
2、方法名须以"Test"打头,并且形参为 (t *testing.T)
go语言对测试函数的名称和签名规定:
功能测试函数: 名称必须以 Test为前缀、并且唯一参数的类型必须是 *testing.T 类型的参数声明
性能测试函数: 名称必须以Benchmark为前缀、并且唯一参数的类型必须是 *testing.B
示例测试函数: 名称必须以Example为前缀、但对参数列表没有强制规定
测试log:
t.Log、t.Logf方法的作用,常规打印日志,测试通过 则不会打印 如果想查看常规测试日志 可以用go test -v 如果想让某个测试函数执行过程中 立即失败 可以调用t.FailNow方法 t.Fail() 表示测试失败,但是后续代码可执行 t.FailNow() 表示 当前函数立即停止,后续代码不再执行 想在测试失败的同时打印失败测试日志 直接调用t.Error方法或者t.Errorf方法 t.Fatal方法和t.Fatalf方法,它们的作用是在打印失败错误日志之后立即终止当前测试函数的执行并宣告测试失败。 更具体地说,这相当于它们在最后都调用了t.FailNow方法。
性能测试:benchmark
命令
命令 go.exe test -v -bench=. -run=^$ ./... goos: windows goarch: amd64 BenchmarkGetPrimes-4 500000 3242 ns/op PASS ok _/D_/Golang_Puzzlers-master/src/puzzlers/article20/q3 5.835s 测试命令 及结果 解释 (./... 当前目录下所有的测试) 第一个标记及其值为-bench=. 只有有了这个标记,命令才会进行性能测试 *该标记的值.表明需要执行任意名称的性能测试函数 第二个标记及其值是-run=^$ 这个标记用于表明需要执行哪些功能测试函数,这同样也是以函数名称为依据的。 *该标记的值^$意味着:只执行名称为空的功能测试函数,换句话说,不执行任何功能测试函数。只执行Benchmark的函数