Не выводить трассировку стека исключений в EUnit

Я пишу тест с EUnit, но не исключение ничего подробного вывода в консоли.

exp_test() ->
  ?assertEqual(0, 1/0).

Запустите этот модуль:exp_test() в выводе оболочки Erlang

** exception error: bad argument in an arithmetic expression
 in function  exp_test:'-exp_test/0-fun-0-'/1 (src/test/eunit/xxx_test.erl, line 8)

Но в EUnit выводится следующее

> eunit:test(xxx).
> xxx_test: exp_test...*failed*
  ::badarith

EUnit ничего не выводит

Я пытаюсь многословный конфиг в eunit, но безрезультатно.

Я хочу вывести некоторые подробности исключения в результат теста eunit.

Благодаря ~

4 ответа

Решение

Eunit довольно старый, и хотя он официально поддерживается командой OTP в Ericsson, о нем обычно не заботятся. В настоящее время Eunit имеет плохую привычку поглощать следы стеков и не обновлялся для номеров строк R15 в исключениях.

Я бы не стал утверждать, что "это так и должно работать". Ни один здравомыслящий инструмент тестирования не должен скрывать детали исключений и номера строк.

Кажется, проблема в том, что версия eunit, поставляемая с R15, не понимает новый формат трассировки стека в R15. Это было исправлено в разрабатываемой версии eunit: github.com/richcarl/eunit

Например:

Eshell V5.10 (abort with ^G)
1> eunit:test(fun() -> (fun() -> exit(foo), ok end)() end).
erl_eval: expr...*failed*
in function erl_eval:do_apply/6 (erl_eval.erl, line 576)
in call from erl_eval:exprs/5 (erl_eval.erl, line 118)
**exit:foo

Я надеюсь, что это войдет в следующую версию OTP R15.

Это известная проблема в eunit, выпущенном в R15B и R15B01. Это было исправлено в выпуске R15B02. Если вы застряли с более ранней версией, вы можете скачать и применить патч:

Обходной путь для выпусков до R15B02

Вы можете решить проблему в вашей локальной установке, перекомпилировав соответствующий модуль:

  1. Загрузите и распакуйте исходные коды Erlang/OTP, если у вас их еще нет.

    wget http://www.erlang.org/download/otp_src_R15B01.tar.gz
    tar xzf otp_src_R15B01.tar.gz
    cd otp_src_R15B01
    
  2. Скачайте и примените патч.

    wget -O eunit-stacktrace.patch https://github.com/erlang/otp/commit/73b94a990bb91fd263dace4ccbaef6ff727a9637.patch
    patch -p1 < eunit-stacktrace.patch
    
  3. Рекомпилированные eunit_lib.erl,

    cd lib/eunit
    erlc -o ebin -I include src/eunit_lib.erl
    
  4. Скопируйте новый eunit_lib.beam поверх старого (обычно где-то ниже /usr/local).

    ls /usr/local/lib/erlang/lib/eunit-2.2.2/ebin/
    # check that eunit_lib.beam is actually there
    sudo cp ebin/eunit_lib.beam /usr/local/lib/erlang/lib/eunit-2.2.2/ebin/
    

Уловка, которую я люблю использовать, ?debugVal(catch expr) где expr является либо begin end блокировать или вызывать неисправную функцию. Например, ?debugVal(catch begin 1 = 2 end) будет выводить трассировку стека в ваших тестах.

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