go test的坑

众所周知,golang自带了单元测试,写的程序都会先进行一遍单元测试。最近在写微信分享的是,签名参数中用到了时间戳,下面的代码,在命令行执行go test -v filename_test.go,每次打印出来的时间戳将会是如出一辙的。golang

// TestSha1 ..

func TestSha1(t *testing.T) {
    s := "sha1 test"
    res := util.EncryptWithSha1(s)
    t.Log("res:", res)
    timestamp := time.Now().Unix()
    t.Log(timestamp)
}

这确实有点不科学,写了这么多的单元测试从未出现过如此这样的问题。这样的测试几乎可能说没有多大意义,好比你第一次测试成功了,你改了入参或者你正测试一个请求,你获得的结果仍然是后第一次如出一辙的。这段测试代码在Vscode执行也是同样的,可是在Goland编译器中点击执行按钮并无出现这个问题,也就是说Goland编译器可能自动处理了。执行测试命令出现上面的猜想是缓存形成的。由于从测试结果也能够看出:缓存

PASS
ok      command-line-arguments    (cached)

看了看golang官方的文档,确实缓存形成的。从Go1.10开始,测试结果将被缓存,golang缓存测试结果这点在官方文档也能看到说明。详情见:https://golang.org/cmd/go/#hdr-Testing_flags微信

go test以包列表模式运行时,go test会缓存成功的包的测试结果以免没必要要的重复测试。固然,有时候咱们测试的时候并不喜欢有缓存,咱们能够手动禁用缓存。能够经过下列方式禁用缓存:单元测试

  • 带上-count=1参数禁用缓存。

    如,执行下面命令测试,便会禁用缓存测试结果测试

go test -v -count=1 filename_test.go
  • 手动清除测试缓存

除了在执行测试命令的时候加上禁用缓存参数,咱们还能够执行下面的命令手动清除缓存,须要注 意的是,每次都得清除,否则下次执行的仍是上次的结果。命令行

go clean -testcache
  • 环境变量设置法

除了上面两种方式,还能够经过环境变量来改变。咱们只须要设置GOCACHE=off便可禁用缓存,不过这样执行测试命令的时候会明显感受有点慢,这很正常,确定没有直接用缓存的结果快。但我对比了第一种方式,发现加行-count=1 参数这种方式比设置环境变量这种效率要高,速度要快点。日志

因此,在用golang测试,千万不要只仅仅用go test就完了,必要时还得加上须要的参数,有些或许连-v参数都不会加,事实上这样是不会打印出log日志的。加上-count就更完美了。code

go test -v -count=1 filename_test.go

在VsCode中要起效,也是须要在设置中加上此参数的。以下:文档

"go.testFlags": ["-v","-count=1"]
相关文章
相关标签/搜索