MDGSF Software Engineer

[GO] golang 测试

2019-03-15
GO

帮助文档

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 文件查看。

链接

https://golang.org/cmd/cover/

https://blog.golang.org/cover


weixingongzhonghao

Comments

Content