今天来讲一讲如何统计 go 代码的测试覆盖率,主要是 cover 命令。

cover 基本用法

1 先简单写个函数和相应的测试,代码如下:

1
2
3
4
5
6
func Max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

这个函数就是简单的比较大小,如果 a > b,返回 a,否则返回 b。

测试代码如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main

import "testing"

func TestMax(t *testing.T) {
	type args struct {
		a int
		b int
	}
	tests := []struct {
		name string
		args args
		want int
	}{
		{
			name: "a is larger than b",
			args: args{
				a: 2,
				b: 1,
			},
			want: 2,
		},
		{
			name: "b is larger than a",
			args: args{
				a: 1,
				b: 2,
			},
			want: 2,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := Max(tt.args.a, tt.args.b); got != tt.want {
				t.Errorf("Max() = %v, want %v", got, tt.want)
			}
		})
	}
}

2 go test -cover 能够统计出代码测试的覆盖率,这是一种比统计函数是否被调用更强悍的手法。我们执行这个命令。输出如下:

1
2
3
PASS
coverage: 100.0% of statements
ok      blog-test       0.265s

可以看到我们的测试覆盖率为 100%。

我们还可以对测试覆盖率进行可视化展示。通过以下命令:

1
2
go test -coverprofile=coverage.out
go tool cover -html=coverage.out

img.png

可以识别和统计出未被测试覆盖的代码。

小结

本文主要讲解 go 如何统计代码测试覆盖率。除了通过命令行的方式,各个 IDE 都有相应的工具统计代码测试覆盖率。

在 GitHub 上, 有的开源项目使用了 Codecov 等工具结合 CI 来统计代码覆盖率。