LoginSignup
1
0

More than 5 years have passed since last update.

erlang: Eunitテスト時debugVal等を使って debugします

Last updated at Posted at 2018-06-21

OTP:20.1.1
Eunitを使ってテストすることが多いです
python2みたいに手軽にprint "Debug Info"を出したい時Eunitの便利なマクロ群を使うと便利です
erlangでも似たようなことができます

前提

テスト対象モジュールに

-include_lib("eunit/include/eunit.hrl").

eunitのヘッダーを追加します

使用

あとはドキュメント通り使えばいいと思います
自分のよく使うマクロは

debugMsg(Message).

?debugMsg("Enter RoutineA").
output
/path/to/test.erl:line:PID:Enter RoutineA

debugVal(Expr)

?debugVal(Body).
output
/path/to/test.erl:line:PID: Body = <<"Request Body">>

debugVal(Expr, Depth)

debugValを使う時Exprが長すぎると、表示が...により省略されることがあります。

bad_sample
/path/to/test.erl:line:PID: Body = <<"Request Has Lonnnnnng Bo...">>

肝心のデバッグ情報が省略されてこれじゃデバッグできないじゃと悩む時、eunitのソースを読んでみると

-define(debugVal(E, D),
        begin
        ((fun (__V) ->
                  ?debugFmt(<<"~ts = ~tP">>,
                            [(??E), __V, D]),
                  __V
          end)(E))
        end).
-ifndef(EUNIT_DEBUG_VAL_DEPTH).
-define(EUNIT_DEBUG_VAL_DEPTH, 15).
-endif.
-define(debugVal(E), ?debugVal(E, ?EUNIT_DEBUG_VAL_DEPTH)).

つまり?debugVal(Expr)実は?debugVal(Expr, 15)を呼び出しています。そしてドキュメントによると

debugVal(Expr, Depth)
Like debugVal(Expr), but prints terms truncated to the given depth.
デフォルトは一つのtermを深さ15まで出力してくれます

したがって?debugVal(Expr, 100000)にすれば多めに出力してくれます。ただし本番環境だとメモリが食うすぎて気をつけること。OTP21だと?debugVal(Expr, 0)で全部出力してくれそう(未検証)
しかし?debugValマクロが使用するformatは<<"~ts = ~tP">>なので、charが全部255以下の場合<<50,48,53,53,51,52,51,56,34,44,10,32,34,110,97,109>>のような意味不明なバイナリーが出力されます
この時は

io:fwrite("show data: ~ts", [Data]).

~tsフォーマットを使って出力すれば元の文字列が見れます。

debugFmt(FmtString, Args)

久しぶりにerlangをかくとよくinterpolationのフォーマットが忘れてしまうのでできるだけ避けてきたが、親切なよりexpressive(表現力の高い)デバッグメッセージを出力したい時はやっぱりdubugFmtを使います(@shino さんのサンブルコードを拝借いたします、thx)

?debugFmt("show data: ~ts", [Data])
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0