1、修改main函数:
package main
//import waring cycle
import (
"os"
"os/signal"
"sync"
"syscall"
)
var endRunning chan bool
var (
confPath string
)
func stop() {
endRunning <- true
}
func handleSignals() {
var callback sync.Once
sigc := make(chan os.Signal, 1)
signal.Notify(sigc, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL)
go func() {
<-sigc
callback.Do(stop)
}()
}
func main() {
handleSignals()
endRunning = make(chan bool, 1)
go func() {
// main函数部分,******
}()
// blocking ...
<-endRunning
}
2、创建main_test.go文件
package main
// This file is mandatory as otherwise the filebeat.test binary is not generated correctly.
import (
"testing"
"flag"
)
var systemTest *bool
func init() {
systemTest = flag.Bool("systemTest", false, "Set to true when running system tests")
}
// Test started when the test binary is started. Only calls main.
func TestSystem(t *testing.T) {
if *systemTest {
main()
}
}
1 命名:看一下自己代码的main()函数所在的go文件名称,直接命名为*_test.go文件即可; 比如,代码文件名 main_server.go,可直接命名为main_server_test.go
2 目录:放在与被测文件同目录下
3、编译代码
1 查看main函数,将其中的os.Exit()更改为return (根据实际情况分别为return/return 0/return 255... 一定要注意,踩坑了很久~~~~~)
2 原编译命令为go build
go test -v file main_test.go -c -covermode=count -coverpkg ./gopath/src/...,.
① -c 表示 生成测试二进制文件
② -covermode=count 表示 生成的二进制中包含覆盖率计数信息
③ -ldflags 用来将版本信息写入二进制文件,而不使用额外的version文件
④ -coverpkg 后面是要统计覆盖率的文件源码
⑤ -o 后面是输出的二进制文件名
⑥ ......可能还有更多的可用参数,我就不知道了
3 执行命令,生成一个可执行的二进制文件,拷贝到部署目录下
4 启动服务,在启动命令后加参数: -systemTest -test.coverprofile coverage/coverage.cov
① -systemTest 用来启动前面说过的main test
② -test.coverprofile 用来指定覆盖率信息写入到哪个文件
4、统计覆盖率
#启动护服务
nohup ./abcd.test -systemTest -test.coverprofile ./coverage.cov &
1 执行自动化
2 执行如下命令,生成覆盖率文件coverage.cov
kill $(pidof abcd.test)
覆盖率产生的条件是程序需要正常退出/结束, 因此当自动化运行完毕后,我们需要给程序发送消息表示结束才可以得到覆盖率文件
对此:go是需要return,即可以kill server_pid(若服务使用supervisor启动,还会自己拉起来,不会影响后续调用)
3 生成测试报告
# go tool cover -html=coverage.cov -o coverage.html
# go tool cover -func=coverage.cov -o coverage.txt
生成xml报告时需要安装一个小插件:go get github.com/t-yuki/gocover-cobertura
将bin下的gocover-cobertura放到方便执行的目录下即可使用