我已经使用rebar3(beta-4)创建了一个release
应用。
添加了一些eunit测试并编写了一些代码。
现在我必须调试一个测试用例,看看我必须添加什么才能使实现正常工作。
我发现了一些关于在erlang控制台中使用dbg的文章,我发现了如何从eunit编写调试信息。但是我需要从我必须测试的代码中获取信息(实际的实现(逻辑))。
当rebar3
与eunit
参数一起使用时,有没有办法调试erlang代码(实际的源代码,而不是测试代码?)
由于
目前我在终端中使用跟踪:https://aloiroberto.wordpress.com/2009/02/23/tracing-erlang-functions/
答案 0 :(得分:5)
执行此操作的一种方法是使用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秒后测试超时,这不会给你很多时间进行调试。您需要为测试指定longer timeout,这就是为什么上面的示例显示正在运行的是名为xyz_test_
的{{3}},它使用长超时包装实际测试。这样的夹具非常简单:
-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
的返回值,本例中的返回值表示被测业务逻辑。此示例夹具将测试超时设置为一小时;您当然可以根据应用需要进行设置。