为你的 AWK 程序提供代码覆盖率
更新:该功能的作者 Volodymyr Gubarkov 已就 GoAWK 的代码覆盖率报告、灵感来源及实现原理撰写了他自己的文章。
尽管我是 GoAWK 的作者,但我自己并不用 AWK 来写多行脚本。我通常用 Python 来写脚本,而 AWK 只在终端里用来写单行命令。
不过,确实有人会用 AWK 编写更长的程序,从实用的到令人惊叹的都有:
- Gron.awk,JSON 扁平化工具 Gron 的克隆版。
- Makesure,一款受 Make 启发的构建工具。
- AWKTC,一款基于终端的俄罗斯方块游戏。
- 一个复古演示,在终端中以 30 FPS 运行。
Gron.awk 和 Makesure 均由乌克兰开发者 Volodymyr Gubarkov 编写,他还创建了 intellij-awk——“缺失的 AWK 语言 IntelliJ IDEA 支持插件”。
几个月前,Volodymyr 在 GoAWK 仓库提交了一个 issue,表示他正在为 GoAWK 添加代码覆盖率功能,“类似于 Go 语言本身内置的功能”。能收到这样有趣的贡献并不常见,而且 Volodymyr 之前已经向项目提交过几个高质量的 bug 报告,所以我很信任他的能力。
我也觉得,能说GoAWK 是我们所知的唯一支持代码覆盖率的 AWK 实现,会是一件很酷的事。
多亏了 Volodymyr 的努力,GoAWK 1.21.0 版本已包含代码覆盖率功能。需要先完成一些重构,然后才能进行主要代码改动——再次感谢 Volodymyr 耐心地完成了整个过程。
如果你正在编写和测试较大的 AWK 程序,可能会觉得这个功能很有用!关于该功能的使用方法和工作原理,这里引用覆盖率文档中的部分内容:
下面是在一个简单的 AWK 程序(prog.awk)上使用 GoAWK 覆盖率功能的截图:

基本用法
生成覆盖率报告最简单的方法是使用 -coverprofile 选项来运行你的 AWK 程序。要以默认的覆盖率模式运行程序并将覆盖率报告写入 cover.out,请执行以下命令:
$ goawk -f prog.awk -coverprofile cover.out
will always run
should run
这会生成一个包含 prog.awk 执行过程覆盖率数据的文件 cover.out。
我们依赖 Go 工具链来可视化覆盖率报告,具体是 go tool cover 命令。该命令会将覆盖率报告渲染为 HTML。如果尚未安装 Go,请立即安装。
要将 HTML 覆盖率报告(如上图截图所示)写入临时文件并在浏览器中打开,请运行以下命令:
$ go tool cover -html=cover.out
如果想将 HTML 文件写入指定文件而不是直接启动浏览器,请使用 -o:
$ go tool cover -html=cover.out -o cover.html
如果想查看带有覆盖率标注的源代码,请在 -covermode 之外再加上 -d 选项。这对于调试或了解 GoAWK 覆盖率功能在底层的实现可能会有帮助:
$ goawk -f prog.awk -covermode set -d
BEGIN {
__COVER["3"] = 1
print "will always run"
if ((1 + 1) == 2) {
__COVER["1"] = 1
print "should run"
} else {
__COVER["2"] = 1
print "won't run"
}
}
所有命令行选项
-coverprofile fn:将覆盖率报告的文件名设为fn。如果指定了此选项但未指定-covermode,则覆盖率模式默认为set。-covermode mode:将覆盖率模式设为mode,可选值有:set:每条语句是否已执行?count:每条语句执行了多少次?(生成热力图报告)
-coverappend:追加到覆盖率配置文件而非覆盖它。这让你可以在程序的多次不同运行中累积覆盖率数据。
祝使用愉快!如发现任何问题,请通过 GitHub issues 反馈。
随机一篇博客
评论
登录后参与讨论