Code coverage for your AWK programs

Ben Hoyt

AWKプログラムのためのコードカバレッジ

原文は Ben Hoyt により に公開されました。 このブログを購読する

更新: この機能の作者であるVolodymyr Gubarkov氏が、GoAWKのコードカバレッジレポートについて、その着想や仕組みを解説した自身の記事を公開しています。

GoAWKの作者ではありますが、私自身は複数行にわたるスクリプトでAWKを使うことはありません。普段はスクリプトをPythonで書き、AWKはターミナルでのワンライナーに使っています。

とはいえ、AWKでより長いプログラムを書いている人もおり、その内容は実用的なものから驚くべきものまでさまざまです。

Gron.awkMakesureは、ウクライナの開発者Volodymyr Gubarkov氏によって書かれたもので、彼はintellij-awk「The missing IntelliJ IDEA language support plugin for AWK」の作者でもあります。

数か月前、Volodymyr氏がissueをGoAWKのリポジトリに投稿し、Go言語自体に組み込まれているものと同様のコードカバレッジ機能をGoAWKに追加していると知らせてくれました。こうした興味深い提案をいただくことはそう多くありませんし、Volodymyr氏はすでにプロジェクトに質の高いバグ報告を何度も寄せてくれていたので、その実力を信頼できました。

また、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」を使用して翻訳されました。

コメント