Go 中的测试覆盖率:衡量并提升代码质量

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何在 Go 中衡量测试覆盖率而不抓狂

\n\n

您已经为您的 Go 应用程序编写了测试。感觉自己像个超级英雄?您做得对。但有一个细节:到底有多少代码被测试覆盖了? 如果没有这个问题的答案,您的信心就只是凭空猜测。

\n\n

“How to measure test coverage in Go” 这个问题是 Stack Overflow 上最热门的问题之一(有数万次浏览)。这并非偶然。开发者不仅想编写测试,还想了解测试的有效性。在本教程中,我们将详细讲解 在 Go 中衡量测试覆盖率的所有方法:从基本命令到使用配置文件和 HTML 报告的高级技术。

\n\n

什么是测试覆盖率,为什么要衡量它?

\n\n

Test coverage(代码测试覆盖率)是一个指标,显示在测试期间执行了您源代码的百分之多少。以百分比表示。100% 的覆盖率并不总是圣杯,但追求高指标是值得的。

\n\n

为什么需要它?

\n
    \n
  • 质量控制: 您可以看到哪些代码段没有测试
  • \n
  • 重构信心: 高覆盖率降低了破坏某些东西的风险
  • \n
  • CI/CD 指标: 可以设置覆盖率阈值,阻止低覆盖率的代码
  • \n
  • 文档: 测试是活的文档,而覆盖率显示了它的完整程度
  • \n
\n\n

陷阱:覆盖率 ≠ 测试质量

\n

请记住:100% 的覆盖率 并不能保证没有 bug。您可以编写只调用函数但不检查任何内容的测试。覆盖率是定量指标。测试质量是定性指标。请同时使用这两种方法。

\n\n

基本衡量:go test -cover

\n\n

我们从最简单的开始。Go 在 go test 工具中内置了对覆盖率的支持。让我们创建一个简单的项目,看看它是如何工作的。

\n\n

创建文件 math.go:

\n\n
package main\n\nfunc Add(a, b int) int {\n    return a + b\n}\n\nfunc Subtract(a, b int) int {\n    return a - b\n}\n\nfunc Multiply(a, b int) int {\n    return a * b\n}\n\nfunc Divide(a, b int) (int, error) {\n    if b == 0 {\n        return 0, nil // 错误:应该是 return 0, errors.New("division by zero")\n    }\n    return a / b, nil\n}
\n\n

现在——测试文件 (math_test.go):

\n\n
package main\n\nimport "testing"\n\nfunc TestAdd(t *testing.T) {\n    result := Add(2, 3)\n    if result != 5 {\n        t.Errorf("expected 5, got %d", result)\n    }\n}\n\nfunc TestSubtract(t *testing.T) {\n    result := Subtract(10, 4)\n    if result != 6 {\n        t.Errorf("expected 6, got %d", result)\n    }\n}\n\n// 故意不测试 Multiply 和 Divide
\n\n

现在使用 -cover 标志运行测试:

\n\n
go test -cover
\n\n

输出将类似于:

\n\n
ok      example/math    0.002s  coverage: 50.0% of statements
\n\n

没错——覆盖了 50% 的代码,因为 Multiply 和 Divide 没有被测试。但这只是一个总体数字。如果我们想看到 详细的覆盖率配置文件 呢?

\n\n

覆盖率配置文件:go test -coverprofile

\n\n

-coverprofile 标志将覆盖率的详细信息保存到一个文件中:

\n\n
go test -coverprofile=coverage.out
\n\n

现在文件夹中出现了一个文件 coverage.out。打开它——这是一种文本格式,每一行显示是否执行了特定的代码指令。但手动阅读它很无聊。让我们转向可视化。

\n\n

HTML 报告:go tool cover -html

\n\n

分析覆盖率最方便的方法是 HTML 报告。它将已执行的代码高亮为绿色,未执行的代码高亮为红色。

\n\n
go tool cove                

博客

书籍推荐