使用 rebar3 时如何调试我的 Eunit 测试套件 运行?

How to debug my Eunit test suite run when using rebar3?

我用 rebar3 (beta-4) 创建了一个 release 应用程序。 添加了一些 eunit 测试并编写了一些代码。

现在我必须调试一个测试用例,看看我必须添加什么才能使实施正常工作。

我从 Erlang 控制台找到了一些关于使用 dbg 的文章,并且我找到了如何从 Eunit 编写调试信息。但是我需要从我必须测试的代码中获取信息(实际实现(逻辑))。

rebar3eunit 参数一起使用时,是否有调试 Erlang 代码(实际源代码,而非测试代码)的方法?

我在终端中使用跟踪,就像那里:https://aloiroberto.wordpress.com/2009/02/23/tracing-erlang-functions/

一种方法是在测试配置文件下使用 rebar3 到 运行 一个 shell,然后启动调试器并设置断点等:

$ rebar3 as test shell
...
1> debugger:start().
{ok, <0.67.0>}

这将弹出debugger GUI。一旦调试器设置并准备就绪,运行 你的测试在 eunit:

2> eunit:test(your_test_module,[verbose]).
======================== EUnit ========================
your_test_module: xyz_test_ (module 'your_test_module')...

假设您在调试器中设置了一个合适的断点,这将命中它,但是您可能 运行 使用这种方法会遇到问题:默认情况下,eunit 测试超时5 秒,这不会给您太多时间进行调试。您需要指定一个名为 xyz_test_longer timeout for your test, which is why the example above shows that what's running is a test fixture,它用很长的超时时间包装实际测试。这样的夹具非常简单:

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

xyz_test_() ->
    {timeout,3600,
     [fun() -> ?assertMatch(expected_value, my_module:my_fun()), ok end]}.

此处,实际测试是匿名函数,它与 my_module:my_fun/0 中的 return 值相匹配,在本例中代表被测业务逻辑。此示例夹具将测试超时设置为一小时;您当然可以根据您的应用程序的需要进行设置。