2012-05-09 2 views
7

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

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

Выполнить этот модуль: exp_test() на выходе Erlang Shell следующие

** 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 Эрикссона, это, как правило, заброшенное. В настоящее время Eunit имеет плохую привычку тратить трассировки стека и не обновлялся для номеров строк R15 в исключениях.

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

+0

tks ваш ответ, я попробую другой способ проверить мой код. – hpyhacking

+0

OTP не поддерживает EUnit - я делаю, когда у меня есть время. И помощь всегда приветствуется. Кстати, если у вас есть пример того, когда EUnit ест трассировку стека, которую она не должна, отправьте ее мне. – RichardC

+0

Как насчет вышеуказанного случая? Исключение составляет исключение из тестового примера или тестируемого кода. –

7

Проблема заключается в том, что версия 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 

Я надеюсь, что это будет сделать это в следующем выпуске ОТП Р15.

+0

[немного другой патч] (https://github.com/erlang/otp/commit/73b94a990bb91fd263dace4ccbaef6ff727a9637), сделанный в 'pu' (т.е. предназначенный для следующего выпуска R15) в ноябре 2011 года. Однако он не был включен в R15B01 ([выпущено 2012-04-02] (http://www.erlang.org/download/otp_src_R15B01.readme)). – legoscia

7

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

обходного путем для выпусков до того 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. Скачать и применить the patch.

    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/ 
    
2

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

+0

спасибо, я попробую. – hpyhacking

+0

@hpyhacking Я бы очень рекомендовал просто клонировать последний ретранслятор eunit и заменять eunit-2.2.2 на вашей локальной машине eunit-2.2.3. – rramsden

Смежные вопросы