Как отладить код erlang во время rebar3 eunit?

Я создал release приложение с rebar3 (бета-4). Добавил несколько тестов eunit и написал немного кода.

Сейчас мне нужно отладить один тестовый пример, чтобы увидеть, что я должен добавить, чтобы реализация работала правильно.

Я нашел несколько статей об использовании dbg из консоли erlang и нашел, как написать отладочную информацию из eunit. Но мне нужно получить информацию из кода, который я должен проверить (фактическая реализация (логика)).

Есть ли способ отладки кода Erlang (реальный исходный код, а не тестовый), когда rebar3 используется с eunit аргумент?

Спасибо


В настоящее время я использую трассировку в терминале, как здесь: https://aloiroberto.wordpress.com/2009/02/23/tracing-erlang-functions/

1 ответ

Решение

Один из способов сделать это - использовать rebar3 запустить оболочку под тестовым профилем, затем запустить отладчик и установить точки останова, например:

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

Появится графический интерфейс отладчика. Как только отладчик настроен и готов, запустите тест под eunit:

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

Предполагая, что вы установили подходящую точку останова в отладчике, это ударит ее, но вы, скорее всего, столкнетесь с проблемой при таком подходе: по умолчанию, eunit время теста истекает через 5 секунд, что не дает много времени на отладку. Вам нужно указать более длительное время ожидания для вашего теста, поэтому в приведенном выше примере показано, что выполняется тестовое устройство с именем xyz_test_, который оборачивает реальный тест с длительным таймаутом. Такое приспособление довольно просто:

-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, который в этом примере представляет тестируемую бизнес-логику. Этот пример прибора устанавливает время ожидания теста на один час; Вы, конечно, можете установить его так, как вам нужно.

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