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 в ваш исходный (а не тестовый) код.

Другие вопросы по тегам