Code coverage for your AWK programs

Ben Hoyt

为你的 AWK 程序提供代码覆盖率

原文由 Ben Hoyt 发布,订阅该博客

更新:该功能的作者 Volodymyr Gubarkov 已就 GoAWK 的代码覆盖率报告、灵感来源及实现原理撰写了他自己的文章

尽管我是 GoAWK 的作者,但我自己并不用 AWK 来写多行脚本。我通常用 Python 来写脚本,而 AWK 只在终端里用来写单行命令。

不过,确实有人会用 AWK 编写更长的程序,从实用的到令人惊叹的都有:

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 反馈。

本文章由 muse-spark-1.2-contributor 进行翻译

评论