时间:2025-09-27 11:07
人气:
作者:admin
代码覆盖率是软件测试中的一种白盒测试度量指标,表示程序源代码中被执行的比例。简单来说,就是“我的测试到底跑过多少代码”。
覆盖率常见的几种标准:
覆盖率并不是越高越好,但如果覆盖率过低,就一定意味着测试不充分。
//1.语句覆盖率 //只保证每条语句被执行,不保证逻辑分支是否被充分验证 if x > 0 { fmt.Println("Positive") } else { fmt.Println("Non-positive") } //2.分支覆盖 //比语句覆盖更强,能保证分支逻辑完整被测。但不能保证复合逻辑条件中的所有子条件都被覆盖。 if x > 0 && y > 0 { fmt.Println("x>0 and y>0") } //分支覆盖只要求覆盖 if 为真和假各一次。 //可能测试了 (x=1,y=1) 和 (x=-1,y=-1),就算达到了分支覆盖,但没保证 y>0 单独为假时的情况。 //3.条件覆盖 //保证每个布尔子条件(子表达式)至少取过一次 true 和 false。 if (x > 0 || y > 0) { fmt.Println("Condition True") } //(x=1, y=1) → 两个条件都 true //(x=1, y=-1) → x true,y false //(x=-1, y=1) → x false,y true //???? 但是注意:并没有测试到 (x=-1, y=-1) 的情况。 //4.路径覆盖 //if (x > 0 && y > 0) 实际上有 4 种组合: //(true, true) → if 条件成立 → 进入 println //(true, false) → if 条件不成立 → 不打印 //(false, true) → if 条件不成立 → 不打印 //(false, false) → if 条件不成立 → 不打印
- 条件覆盖: 关注的是子条件本身取没取过 true/false。
路径覆盖: 关注的是整个条件组合下程序的执行路径有没有覆盖全。
为什么要关心覆盖率?
Go 语言自带了覆盖率工具,无需额外安装包。核心思想是:
???? 编译前自动在源码中“埋点”,运行时收集统计信息,最后输出覆盖率数据。
//score.go package main func GetGrade(score int) string { if score >= 60 { return "pass" } return "fail" }
//score_test.go package main import "testing" func TestGetGrade(t *testing.T) { tests := []struct { score int want string }{ {50, "fail"}, {80, "pass"}, } for _, tt := range tests { got := GetGrade(tt.score) if got != tt.want { t.Errorf("GetGrade(%d) = %s; want %s", tt.score, got, tt.want) } } }
注意:
测试文件必须以 _test.go 结尾。
测试函数必须以 Test 开头,参数为 t *testing.T。
go test -cover //输出结果类似 PASS coverage: 66.7% of statements
go test -coverprofile=coverage.out //执行后,会在当前目录生成 coverage.out 文件,里面记录了每行代码是否被执行。
go tool cover -func=coverage.out //输出示例 score.go:3: GetGrade 100.0% total: (statements) 100.0%
go tool cover -html=coverage.out
浏览器会打开一份高亮源码报告:
绿色 = 覆盖到
红色 = 未覆盖
在实际项目中,我们可能需要收集 整个服务在运行过程中的覆盖率,而不仅仅是单元测试。比如执行完所有自动化用例后,再统计覆盖率。
//1.创建maint_test.go //为main()函数增加测试入口 package main import "testing" func TestMainFunc(t *testing.T) { main() } //如果 main() 里有 os.Exit(),需要改成 return,避免提前退出。 //2.编译测试二进制文件 go test -covermode=count -coverpkg=./... -c -o app.test -covermode=count:统计覆盖次数。 -coverpkg=./...:指定需要统计覆盖率的所有源码。 -o app.test:生成带覆盖率信息的可执行文件。 //3.运行并收集覆盖率 //启动服务时加上:./app.test -test.coverprofile=coverage.cov //4.生成最终报告 go tool cover -html=coverage.cov -o coverage.html //打开 coverage.html,就能看到完整的覆盖率分析。
覆盖率是 发现问题的工具,而不是最终目标。
单元测试关注 函数级别 的覆盖率;集成测试关注 业务流程 的覆盖率。
建议团队设定合理目标(如 70%-80%),但不要盲目追求 100%。
参考:https://zhuanlan.zhihu.com/p/408597805