在?_assertEqual失败时显示完整的预期值和值信息

时间:2012-06-08 16:36:07

标签: erlang eunit

我正在编写一个单元测试,其中生成一个(相当冗长的)二进制文件,我想断言生成的二进制文件等于我期望生成的二进制文件。我正通过“ rebar eunit ”运行eunit。

事情是,当这个断言失败时,输出会被“ ... ”所取代,我希望看到完整的输出,这样我就可以发现差异在哪里。

我现在正在使用“?debugFmt()”作为临时解决方案,但我想知道是否有替代方案(可在某处使用配置选项或参数)到“?_ assertEqual()”所以输出仅在断言失败时显示。)

提前致谢!

编辑:由于 legoscia的答案,我使用测试生成器包含一个测试样本,有多个断言:

can_do_something(SetupData) ->
    % ... some code ... 
    [?_assertEqual(Expected1, Actual1), ?_assertEqual(Expected2, Actual2)].

4 个答案:

答案 0 :(得分:4)

我能想到的在控制台中实际显示值的最佳方法是:

Actual =:= Expected orelse ?assert(?debugFmt("~p is not ~p", [Actual, Expected]))

?debugFmt返回ok,这不是真的,所以断言总会失败。

或者,要将它用作测试生成器,整个事物可以放在?_assert内:

?_assert(Actual =:= Expected orelse ?debugFmt("~p is not ~p", [Actual, Expected]))

答案 1 :(得分:4)

1)。打开您的eunit源。在我的系统中:

cd /usr/lib/erlang/lib/eunit-2.3.2/src

2)。以这种方式编辑eunit_lib.erl:

diff

54c54
<     format_exception(Exception, 20).
---
>     format_exception(Exception, 99999).

3)。 sudo erlc -I ../include eunit_lib.erl

4)。 mv eunit_lib.beam ../ebin

5)。祝你有个美好的一天))

答案 2 :(得分:3)

我通常实现这一点的方法是使Eunit输出XML文件(采用“Surefire”格式,AKA“Junit”格式)。 XML文件对术语打印深度有更高的限制,因此可能包含您需要的信息。

将此添加到您的rebar.config

{eunit_opts, 
 [verbose,
  %% eunit truncates output from tests - capture full output in
  %% XML files in .eunit
  {report,{eunit_surefire,[{dir,"."}]}}]}.

然后,您可以在foo中找到模块.eunit/TEST-foo.xml的结果。我发现这些文件在文本编辑器中非常易读。

答案 3 :(得分:3)

This PRprint_depth引入了eunit:test/2选项:

eunit:test(my_test, [{print_depth, 200}]).

它应该从OTP-23开始可用。

print_depth设置为更大的数字将减少输出的截断。