这种编写test的操作还是我实习的小哥哥教我的,个人觉得特别的实用,我们编写项目的时候难免不会出现某个调用不确定!这个输出结果是否是我们期望的!很多是否都要碰都这种情况,特别是在写一些项目的时候,文件很多代码也多,以前在不知道这样方法的时候就很恼火,以前在遇到这种情况的时候处理方法就是用IDE新建一个环境,然后把要测试的函数直接复制过去,但是这样不仅麻烦很多时候还没有办法做。
打个比方:我现在不确定我用gorm(Go语言中一个比较火的orm第三方包)写了一个model的查询,但是我不确定我写的这个是否有问题,那么就只有另外写一个东西来运行测试这个函数是否正确。但是model的查询等等,都是还是很多数据库初始化连接,读取配置文件中的数据库配置信息等,一大堆的东西,所以就很麻烦。自从小哥哥教了我写test这种“高大上”的操作,“妈妈再也不用担心我的学习了”。
我现在拿一个我实习正在更新的一个项目举一个列子:
首先我先讲一下这个项目的其中一个需求:
- 这个后端的系统需要接受用户上传的图片,那么我们肯定需要对用户上传的图片做一些检查,检查用户是不是上传的一个图片呀,一般也就是对文件的后缀进行检查,把其他的可能存在一些攻击的文件进行过滤。
文件结构如图所示:
其中的post.go文件内部有两个函数:(这个项目用了gin框架)
func Post(c *gin.Context) //用作接受提交的POST图片上传请求
func CheckFile(f *multipart.FileHeader) (newFileName string, flag bool) //用于文件合法检查
CheckFile
post.go
**_test.go
package image
import (
"fmt"
"mime/multipart"
"testing"
)
func TestCheckFile(t *testing.T) {
f := multipart.FileHeader{}
f.Filename = "1.jpg.go"
filename, err := CheckFile(&f)
if !err {
fmt.Println("文件类型错误")
} else {
fmt.Println("new file name is ", filename)
}
}
testingTestCheckFile
go test -v*testing.Tfunc TestCheckFile(t *testing.T)
高级点的test用法
比如我门需要测试一个文件里面的多个函数,比如我写了一个测试的例子:
main_test.gogo test -v
一般情况下都是按照文件函数编译的顺序来执行的,但是go官方并没有说这一定是按照这个顺序来执行的。我自己运行了下执行的顺序确实是按照顺序执行的。
test$ go test -v
=== RUN TestA
goo
--- PASS: TestA (0.00s)
=== RUN TestB
gogogo
--- PASS: TestB (0.00s)
=== RUN TestC
gogogo
--- PASS: TestC (0.00s)
PASS
ok test 0.005s
main_test.gogoo()
go test -v
[alphababy@AlphaBaby] test$ go test -v
=== RUN TestA
goo
--- PASS: TestA (0.00s)
=== RUN TestB
--- SKIP: TestB (0.00s)
=== RUN TestC
--- SKIP: TestC (0.00s)
PASS
ok test 0.005s
main.goTestATestBTestC
看我是怎么处理的:
执行结果就是如下所示。
test$ go test -v
=== RUN TestPrint
=== RUN TestPrint/A
goo
=== RUN TestPrint/2
=== RUN TestPrint/3
gogogo
--- PASS: TestPrint (0.00s)
--- PASS: TestPrint/A (0.00s)
--- SKIP: TestPrint/2 (0.00s)
--- PASS: TestPrint/3 (0.00s)
PASS
ok test 0.005s
TestMain
go test -v
test$ go test -v
TestMain is first exec!
=== RUN TestPrint
=== RUN TestPrint/A
goo
=== RUN TestPrint/2
=== RUN TestPrint/3
gogogo
--- PASS: TestPrint (0.00s)
--- PASS: TestPrint/A (0.00s)
--- SKIP: TestPrint/2 (0.00s)
--- PASS: TestPrint/3 (0.00s)
PASS
ok test 0.005s
其中有两点应该注意:
TestMainm.Run()m.Run()
更高级点的test用法
我们的testing包中的工具不仅能测试我们函数功能上是否有BUG还能测试函数的性能。
那这个怎么写呢?:我再给大家一个demo:
$ go test -v -bench=.
[alphababy@AlphaBaby] test$ go test -v -bench=.
TestMain is first exec!
=== RUN TestPrint
=== RUN TestPrint/A
goo
=== RUN TestPrint/2
=== RUN TestPrint/3
gogogo
--- PASS: TestPrint (0.00s)
--- PASS: TestPrint/A (0.00s)
--- SKIP: TestPrint/2 (0.00s)
--- PASS: TestPrint/3 (0.00s)
goos: darwin
goarch: amd64
pkg: test
BenchmarkA-4 2000000000 0.29 ns/op
PASS
ok test 0.623s
BenchmarkAb.Ntestingtest
但是这里还是有几点注意:
BenchmarkXXXBenchmarkXXXTestXXXm.Run()BenchmarkXXX
如果后面有有趣的,还会继续分享