Edebugは基本的なカバレッジテスト(coverage test)と実行頻度(execution frequency)の表示を提供します。
カバレッジテストは、すべての式の結果と以前の結果を比較することによって機能します。プログラム内の各フォームがカレントEmacsセッション内でカバレッジテストを開始して以降に、2つの異なる値をリターンしたら、それらのフォームはカバーされたと判断されます。したがってプログラムにカバレッジテストを行なうには、そのプログラムをさまざまなコンディション下で実行して、プログラムが正しく振る舞うかに注目します。異なるコンディション下で十分にテストして、すべてのフォームが異なる2つの値をリターンしたとき、Edebugはそのことを告げるでしょう。
カバレッジテストにより実行速度が低下するので、edebug-test-coverage
が非nil
のときだけカバレッジテストが行なわれます。頻度計数(frequency
count)はたとえ実行モードがGo-nonstopでも、カバレッジテストが有効か無効かに関わらずすべての式にたいして行われます。
定義にたいするカバレッジ情報と頻度数の両方を表示するにはC-x X =
(edebug-display-freq-count
)を使用します。単に=
(edebug-temp-display-freq-count
)とすると、他のキーをタイプするまでの間だけ一時的に同様の情報を表示します。
このコマンドはカレント定義の各行の頻度数を表示する。
このコマンドはコードの各行の下にコメント行として頻度数を挿入する。1回のundo
コマンドですべての挿入をアンドゥできる。頻度数は式の前の‘(’か式の後の‘)’、または変数の最後の文字の下に表示される。表示をシンプルにするために同一行にたいして式の以前頻度数と頻度数が同じ場合は表示しない。
ある式にたいする頻度数の後に文字‘=’がある場合は、その式が評価されるたびに同じ値を毎回リターンしていることを表す。言い換えるとカバレッジテストの目的からは、その式はまだカバーされていないということである。
ある定義にたいして頻度数とカバレッジデータを明確にするには、単にeval-defun
で再インストルメントすればよい。
たとえばソースのbreakpointで(fac
5)
を評価した後にedebug-test-coverage
をt
にセットすると、breakpointに達したときの頻度データは以下のようになります:
(defun fac (n) (if (= n 0) (edebug)) ;#6 1 = =5 (if (< 0 n) ;#5 = (* n (fac (1- n))) ;# 5 0 1)) ;# 0
コメント行はfac
が6回呼び出されたことを表しています。最初のif
命令は毎回同じ結果を5回リターンしています。同じ結果という意味では2つ目のif
の条件にも当てはまります。fac
の再帰呼び出しは結局リターンしません。