这种编写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

如果后面有有趣的,还会继续分享