帮助文档
go help testflag
go tool cover -help
单元测试
运行当前目录下的测试文件 *_test.go
go test
查看详细信息
go test -v
执行指定测试文件
go test -v hello_test.go
执行指定测试函数
go test -v -test.run TestAgent
执行指定测试文件下的测试函数
go test -v hello_test.go -test.run TestAgent
生成覆盖率
go test -cover -coverprofile=cover.out
go tool cover -html=cover.out -o coverage.html
执行当前目录下及其子目录下的所有测试文件
go test ./...
go test github.com/hujia-team/annotations_tool/...
运行包 github.com/hujia-team/annotations_tool 下面,包括子目录的所有测试文件
跳过缓存。(默认情况下,第一次执行过了,第二次就会有缓存)
go test -count=1
测试性能
go test -bench=. -run=none -benchmem
快速运行单元测试
把下面这个 shell 函数加入到 ~/.profile 中,然后就可以直接执行 cover 命令了。
cover () {
local t=$(mktemp -t cover.XXXXXXXXXX)
go test $COVERFLAGS -coverprofile=$t $@ \
&& go tool cover -func=$t \
&& unlink $t
}
集成测试
main.go 是一个 web 服务器,现在需要测试 HTTP 接口覆盖率。
1. 新建 main_test.go 文件
package main
import (
"os"
"os/signal"
"strings"
"syscall"
"testing"
)
func TestMain(t *testing.T) {
var (
args []string
)
for _, arg := range os.Args {
switch {
case strings.HasPrefix(arg, "DEVEL"):
case strings.HasPrefix(arg, "-test"):
default:
args = append(args, arg)
}
}
waitCh := make(chan int, 1)
os.Args = args
go func() {
main()
close(waitCh)
}()
signalCh := make(chan os.Signal, 1)
signal.Notify(signalCh, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGHUP)
select {
case <-signalCh:
return
case <-waitCh:
return
}
}
2. 生成 main.test 测试使用的可执行文件
go test -c -race -cover -covermode=atomic -o main.test -coverpkg $pkgs
$pkgs 是包的路径
pkgs=pkg1,pkg2,pkg3,....
3. 执行 main.test
./main.test -test.coverprofile=main.test.cover.out
4. 执行测试用例
执行当前目录下和子目录下的所有 *_test.go 文件
go test -count=1 -v ./...
5. 暂停 main.test 的执行
用 ctrl+C 暂停 main.test 的运行
暂停之后,就会在目录下生成 main.test.cover.out 这个覆盖率文件。
6. 生成可视化HTML
go tool cover -html=main.test.cover.out -o cover.html
7. 查看覆盖率
用浏览器打开 cover.html 文件查看。