【问题标题】:not output exception stack trace in EUnit不在 EUnit 中输出异常堆栈跟踪
【发布时间】:2012-05-17 13:32:02
【问题描述】:

我正在使用 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 输出中

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

EUnit 不输出任何异常跟踪信息

我尝试在 eunit 中进行详细配置,但没有效果。

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

谢谢~

【问题讨论】:

    标签: erlang eunit


    【解决方案1】:

    这是在 R15B 和 R15B01 中发布的 eunit 中的一个已知问题。这已在版本 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) 其中 expr 是 begin end 块 或调用失败的函数。例如,?debugVal(catch begin 1 = 2 end) 将在您的测试中输出堆栈跟踪。

      【讨论】:

      • @hpyhacking 我强烈建议您暂时克隆最新的 eunit 存储库并用 eunit-2.2.3 替换本地计算机上的 eunit-2.2.2。
      【解决方案3】:

      问题似乎是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 的下一个版本。

      【讨论】:

      【解决方案4】:

      Eunit 已经很老了,虽然它由爱立信的 OTP 团队官方维护,但通常无人维护。 Eunit 目前有吃掉堆栈跟踪的坏习惯,并且在异常中没有更新 R15 的行号。

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

      【讨论】:

      • OTP 不维护 EUnit - 我会,只要我有时间。并且总是欢迎帮助。顺便说一句,如果你有一些 EUnit 吃掉不应该吃的堆栈跟踪的例子,请发给我。
      • 上述情况呢?无法推断异常是来自测试用例还是来自被测代码。
      • 在他的例子中,被测代码就是测试用例。 ?assertEqual(0, 1/0) 就是全部。如果异常发生在某个被调用函数的更深处,您应该会看到堆栈跟踪。但我会仔细研究一下,看看是否可以做更多的事情。
      • 早上,我再试一次,在Gist写一些代码,得到同样的错误结果。我将错误代码放在函数调用中,而不是在 assert marco 中。谢谢你,RichardC 和亚当。要知道,在一个大模块中发现错误代码是令人抓狂的。
      猜你喜欢
      • 2011-01-05
      • 2017-08-06
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多