go test 单元测试覆盖率以及如何用dlv调试

1,242 阅读1分钟

dlv 对go test调试

例如: 要对TestAAA进行dlv断点调试: dlv test -- -test.run TestAAA -test.v

覆盖率及其查询

  • go test -v -gcflags=all=-l -cover ./... -coverprofile=coverage.data ./...
  • 查看各个文件以及总体的覆盖率:go tool cover -func=coverage.data -o coverage.txt
  • 用网页查看没有覆盖到的代码(打开html文件即可):go tool cover -html=coverage.data -o coverage.html

go test 带条件编译

  • go test -run TestManagerMonitoringCleanUp1 -gcflags=all=-l -tags "simulator" -v
  • 有些场景下某个函数在不同的文件有相同的实现,然后用不同的tag来编译不同的文件,这时候需要用到tag指令

go test可以指定package或者列表做test

  • -coverpkg pkg1,pkg2,pkg3

并行执行测试(Parallelizing tests)

  • 默认情况下,指定包的测试是按照顺序执行的,但也可以通过在测试的函数内部使用 t.Parallel() 来标志某些测试也可以被安全的并发执行(和默认的一样,假设参数名为 t)

打桩库

github.com/agiledragon…

  • 可以对某些不方便测试的接口进行打桩,方便于我们对关心的逻辑进行核心测试
  • 值得注意的点是gomonkey中描述的feature:support a patch for a private member method(可以对结构体中的私有函数进行mock)

之前遇到的坑

func Testxxxxxx(t *testing.T) {
    xxx1()
    xxx2()
    xxx3()
}
  • 经验: go test打印出来的panic, 不一定是离它最近的行数, 可能是理它很远,要在周围几条test用例都单独测试下才能确定答案 这种主要是因为golang的很多日志库是异步的。

参考资料