Не выводить трассировку стека исключений в 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
Вы можете решить проблему в вашей локальной установке, перекомпилировав соответствующий модуль:
Загрузите и распакуйте исходные коды Erlang/OTP, если у вас их еще нет.
wget http://www.erlang.org/download/otp_src_R15B01.tar.gz tar xzf otp_src_R15B01.tar.gz cd otp_src_R15B01
Скачайте и примените патч.
wget -O eunit-stacktrace.patch https://github.com/erlang/otp/commit/73b94a990bb91fd263dace4ccbaef6ff727a9637.patch patch -p1 < eunit-stacktrace.patch
Рекомпилированные
eunit_lib.erl
,cd lib/eunit erlc -o ebin -I include src/eunit_lib.erl
Скопируйте новый
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)
будет выводить трассировку стека в ваших тестах.