2012-05-09 17 views
7

Estoy escribiendo una prueba con EUnit, pero no hay ninguna excepción en la consola.no muestra el seguimiento de la pila de la excepción en EUnit

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

Ejecutar este módulo: exp_test() en la salida de Erlang Shell siguiente

** 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) 

Pero en la producción EUnit siguiente

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

EUnit no información de rastreo de salida nada excepción

Estoy intentando la configuración detallada en eunit, pero no hay efecto.

Quiero mostrar algunos detalles de excepción en el resultado de la prueba de eunit.

Gracias ~

Respuesta

4

Eunit es bastante antiguo y, si bien se mantiene oficialmente por parte del equipo OTP en Ericsson, por lo general es querido. Actualmente, Eunit tiene la mala costumbre de consumir rastros de pila, y no se ha actualizado para los números de línea del R15 en las excepciones.

No diría que "así se supone que funciona". Ninguna herramienta de prueba en su sano juicio debe ocultar los detalles de la excepción y los números de línea por usted.

+0

tks su respuesta, intento probar de otra manera mi código. – hpyhacking

+0

OTP no mantiene EUnit, lo hago, cuando tengo el tiempo. Y la ayuda siempre es bienvenida. Por cierto, si tiene algún ejemplo de cuando EUnit come un rastro de pila que no debería, por favor envíemelo. – RichardC

+0

¿Qué tal el caso anterior? Es imposible deducir si la excepción proviene del caso de prueba o del código bajo prueba. –

7

El problema parece ser que la versión de eunit enviada con R15 no comprende el nuevo formato de rastreo de pila en R15. Esto se ha corregido en la versión de desarrollo de eunit: github.com/richcarl/eunit

Por ejemplo:

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 

espero que esto hará que en la próxima versión de OTP R15.

+0

A [parche ligeramente diferente] (https://github.com/erlang/otp/commit/73b94a990bb91fd263dace4ccbaef6ff727a9637) hecho en 'pu' (es decir, destinado a la próxima versión R15) en noviembre de 2011. Sin embargo, no se incluyó en R15B01 ([publicado el 2012-04-02] (http://www.erlang.org/download/otp_src_R15B01.readme)). – legoscia

7

Este es un problema conocido en eunit como el publicado en R15B y R15B01. Esto se ha corregido en la versión R15B02. Si está atrapado con una versión anterior, se puede descargar y aplicar a patch:

Hay una solución a los comunicados antes R15B02

Puede solucionar el problema en su instalación local mediante la compilación del módulo afectado:

  1. Descargue y descomprima las fuentes de Erlang/OTP, si aún no las tiene.

    wget http://www.erlang.org/download/otp_src_R15B01.tar.gz 
    tar xzf otp_src_R15B01.tar.gz 
    cd otp_src_R15B01 
    
  2. Descargar y aplicar the patch.

    wget -O eunit-stacktrace.patch https://github.com/erlang/otp/commit/73b94a990bb91fd263dace4ccbaef6ff727a9637.patch 
    patch -p1 < eunit-stacktrace.patch 
    
  3. recompilación eunit_lib.erl.

    cd lib/eunit 
    erlc -o ebin -I include src/eunit_lib.erl 
    
  4. Copiar el nuevo eunit_lib.beam sobre el viejo (por lo general en algún lugar debajo /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

Un truco que me gusta usar es ?debugVal(catch expr) donde expr es o bien un bloque begin end o una llamada a la función falla. Por ejemplo, ?debugVal(catch begin 1 = 2 end) generará una stacktrace en sus pruebas.

+0

gracias, lo intentaré. – hpyhacking

+0

@hpyhacking Recomiendo encarecidamente clonar el último eunit repo y reemplazar eunit-2.2.2 en su máquina local con eunit-2.2.3 por el momento. – rramsden

Cuestiones relacionadas