Erlang 在EUnit中不输出异常堆栈跟踪

Erlang 在EUnit中不输出异常堆栈跟踪,erlang,eunit,Erlang,Eunit,我正在用EUnit编写一个测试,但在控制台中没有任何异常细节输出 exp_test() -> ?assertEqual(0, 1/0). 在Erlang Shell输出中运行以下模块:exp_test() ** 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

我正在用EUnit编写一个测试,但在控制台中没有任何异常细节输出

exp_test() ->
  ?assertEqual(0, 1/0).
在Erlang Shell输出中运行以下模块:exp_test()

** 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:test(xxx).
> xxx_test: exp_test...*failed*
  ::badarith
但在EUnit中,输出如下

** 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:test(xxx).
> xxx_test: exp_test...*failed*
  ::badarith
EUnit不输出任何异常跟踪信息

我正在尝试eunit中的详细配置,但没有效果

我想在eunit测试结果中输出一些异常细节


谢谢~

Eunit已经很老了,虽然它是由爱立信的OTP团队正式维护的,但它通常不受关注。Eunit目前有消耗堆栈跟踪的坏习惯,并且在异常情况下没有更新R15的行号


我不会说“这就是它应该如何工作的”。任何正常的测试工具都不应该为您隐藏异常详细信息和行号。

问题似乎在于R15附带的eunit版本不理解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的下一个版本。

这是在R15B和R15B01中发布的eunit中的一个已知问题。这已在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
    
  • 下载并应用

  • 将新的
    eunit_lib.beam
    复制到旧的
    /usr/local
    下面的某个地方


  • 我喜欢使用的技巧是
    ?debugVal(catch expr)
    其中expr是
    开始-结束

    或者调用失败的函数。例如,
    ?debugVal(catch begin 1=2 end)
    将在测试中输出堆栈跟踪。

    OTP不维护EUnit-我有时间时会维护。而且总是欢迎帮助。顺便说一句,如果你有一些EUnit不应该吃堆栈跟踪的例子,请发送给我。上面的例子呢?无法推断异常是来自测试用例还是来自被测代码。在他的例子中,被测代码就是测试用例?assertEqual(0,1/0)是所有的。如果异常发生在某个被调用函数的更深处,您应该会看到堆栈跟踪。但我会更仔细地看一下,看看是否可以做更多的事情。早上,我会再试一次,写一些代码,然后得到相同的错误结果。我将错误代码放在函数调用中,而不是assert marco中。谢谢你,RichardC和Adam。你知道,在一个大模块中发现错误代码是令人恼火的。2011年11月,一个在
    pu
    中制造的错误代码(即,用于下一个R15版本)。但是,R15B01()中没有包含它。@hpyhacking我强烈建议克隆最新的eunit repo,并暂时用eunit-2.2.3替换本地机器上的eunit-2.2.2。
    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/