2012-02-10 3 views
4

Допустим, у меня есть модуль под названием example.erlEUnit информация отладочного вывода из протестированных модулей

В этом модуле я использую следующие построения для отладки:

%%% 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: Я нашел some related info, но я до сих пор не знаю, как решить проблему.

ответ

15

Как описано на указанной вами странице, вы можете использовать debugMsg или debugFmt.

?debugMsg("Function fun1 starting...") 

или

?debugFmt("Function fun1 starting...", []) 

сделать заголовочный файл, что вы включаете eunit находятся в вашем файле модуль.

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

Если вы хотите, чтобы отключить отладку макросов, например, в постановке, определяют NODEBUG при составлении модулей.

+0

? DebugFmt отлично работает! Но как быстро его включить или выключить? Раньше я использовал DBG, определенный в двух строках (как в моем вопросе). Я попытался сделать следующее: '-define (dbgFmt (Str, Args), ok) .', но выход все еще существует. – skanatek

+4

определяют макрос NODEBUG, такой как '-define (NODEBUG, true) .'. Убедитесь, что вы определили его ** ПЕРЕД **, включая eunit.hrl, – shino

0

Идти в подобную проблему. Нашел другой путь благодаря @rvirding. Решением является запись в выходной поток (как в io:format(user, "~w", [Term])).

Это задокументировано в разделе «EUnit фиксирует стандартный выход» eunit docs.

Мой файл "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 конкретный код в ваш источник (а не тест) код.