AWKプログラムのためのコードカバレッジ
原文は Ben Hoyt により に公開されました。 このブログを購読する
更新: この機能の作者であるVolodymyr Gubarkov氏が、GoAWKのコードカバレッジレポートについて、その着想や仕組みを解説した自身の記事を公開しています。
GoAWKの作者ではありますが、私自身は複数行にわたるスクリプトでAWKを使うことはありません。普段はスクリプトをPythonで書き、AWKはターミナルでのワンライナーに使っています。
とはいえ、AWKでより長いプログラムを書いている人もおり、その内容は実用的なものから驚くべきものまでさまざまです。
- Gron.awk — JSONフラットナーGronのクローン。
- Makesure — Makeに着想を得たビルドツール。
- AWKTC — ターミナル上で動作するテトリスゲーム。
- オールドスクールなデモ — ターミナル上で30FPSで動作します。
Gron.awkとMakesureは、ウクライナの開発者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でご報告ください。
記事をランダムに読む
コメント
ログインしてコメントする