10

假设我有一个名为example.erl

在此模块中,我使用以下构造进行调试:

%%% Switch debugging output on/off:
%-define(DBG(Str, Args), ok).
-define(DBG(Str, Args), io:format(Str, Args)).

它可以帮助我将各种调试信息输出到 Erlang shell:

?DBG("Function fun1 starting... ~n", [])

但是,如果我example.erlexample_testswith调用example:test(),则不会出现此输出信息。

如何在 EUnit 测试期间使其可见?

UPD:我找到了一些相关信息,但我仍然不知道如何解决这个问题。

4

2 回答 2

20

如您提到的页面中所述,您可以使用 debugMsg 或 debugFmt。

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

或者

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

确保在模块文件中包含 eunit 的头文件。

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

如果要禁用调试宏,例如在登台中,请在编译模块中定义 NODEBUG。

于 2012-02-11T13:39:37.327 回答
1

遇到了类似的问题。感谢@rvirding,找到了另一种方式。解决方案是写入用户输出流(如 中io:format(user, "~w", [Term]))。

这在eunit docs的标题为“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 特定代码注入到您的源代码(而不是test)代码中。

于 2017-11-18T17:25:07.937 回答