EUnit выводит отладочную информацию из протестированных модулей
Допустим, у меня есть модуль под названием example.erl
В этом модуле я использую следующую конструкцию для отладки:
%%% Switch debugging output on/off:
%-define(DBG(Str, Args), ok).
-define(DBG(Str, Args), io:format(Str, Args)).
Это помогает мне выводить различную отладочную информацию в оболочку Erlang:
?DBG("Function fun1 starting... ~n", [])
Но если я позвоню example.erl
от example_tests
с example:test()
, эта выходная информация не отображается.
Как я могу сделать это видимым во время теста EUnit?
UPD: я нашел некоторую связанную информацию, но я все еще не знаю, как решить проблему.
2 ответа
Как описано на странице, которую вы упоминаете, вы можете использовать debugMsg или debugFmt.
?debugMsg("Function fun1 starting...")
или же
?debugFmt("Function fun1 starting...", [])
Убедитесь, что вы включили заголовочный файл eunit в файл модуля.
-include_lib("eunit/include/eunit.hrl").
Если вы хотите отключить отладочные макросы, например, при подготовке, определите NODEBUG в компиляционных модулях.
Столкнулся с аналогичной проблемой. Нашел другой способ благодаря @rvirding. Решение состоит в том, чтобы записать в поток вывода пользователя (как в io:format(user, "~w", [Term])
).
Это задокументировано в разделе "EUnit захватывает стандартный вывод" документации eunit.
Мой файл trace.hrl показан ниже:
%% If compiled with {d, TEST, true}
%% This happens automatically during `rebar3 eunit`
-ifdef(TEST).
-define(TRACE(Template, Args), io:format(user, "TRACE ~p:~p ~p~n", [?MODULE, ?LINE, lists:flatten(Args)])).
-else.
-define(TRACE(_T, _A), void).
-endif.
Пример исходного файла:
-module(foo).
-export([ api/1 ]).
-include("trace.hrl").
api(Arg) ->
?TRACE("Called with Arg ~p~n", [Arg]),
ok.
Я предпочитаю этот метод ?debugFmt
, так как последний вводит специальный код EUnit в ваш исходный (а не тестовый) код.