在Erlang中获取Eunit的测试结果

时间:2012-06-14 05:48:26

标签: erlang eunit

我正在使用Erlang和EUnit进行单元测试,我想编写一个测试运行器来自动运行单元测试。问题是eunit:test / 1似乎只返回“错误”或“确定”而不是测试列表以及他们返回的内容是通过还是失败。

那么有没有办法运行测试并返回某些形式的数据结构,包括测试运行的内容及其通过/失败状态?

3 个答案:

答案 0 :(得分:9)

如果您正在使用钢筋,则无需实施自己的跑步者。你可以简单地运行:

rebar eunit

Rebar将编译并运行test目录中的所有测试(以及模块内的eunit测试)。此外,钢筋允许您在rebar.config中设置与shell中相同的选项:

{eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.

您也可以在shell中使用这些选项:

> eunit:test([foo], [verbose, {report,{eunit_surefire,[{dir,"."}]}}]).

另请参阅verbose optionstructured report的文档。

另一种选择是使用Common Test而不是Eunit。 Common Test附带一个跑步者(ct_run命令),为您提供更灵活的测试设置,但使用起来也稍微复杂一些。 Common Test缺乏可用的宏,但产生了非常易于理解的html报告。

答案 1 :(得分:6)

没有简单或记录的方式,但目前有两种方法可以做到这一点。一种是在运行测试时给出选项'event_log':

eunit:test(my_module, [event_log])

(这是未记录的,实际上只用于调试)。生成的文件“eunit-events.log”是一个文本文件,Erlang可以使用file:consult(Filename)读取。

更强大的方式(并不是真的那么困难)是实现自定义事件监听器并将其作为eunit的选项提供:

eunit:test(my_module, [{report, my_listener_module}])

这还没有记录,但它应该是。侦听器模块实现eunit_listener行为(请参阅src / eunit_listener.erl)。只有五个回调函数可以实现。请查看src / eunit_tty.erl和src / eunit_surefire.erl作为示例。

答案 2 :(得分:2)

我刚刚向GitHub推送了一个非常简单的监听器,它将EUnit结果存储在DETS表中。如果您需要进一步处理这些数据,这可能很有用,因为它们在DETS表中存储为Erlang术语。

https://github.com/prof3ta/eunit_terms

使用示例:

> eunit:test([fact_test], [{report,{eunit_terms,[]}}]).
All 3 tests passed.
ok
> {ok, Ref} = dets:open_file(results).
{ok,#Ref<0.0.0.114>}
> dets:lookup(Ref, testsuite).
[{testsuite,<<"module 'fact_test'">>,8,<<>>,3,0,0,0,
        [{testcase,{fact_test,fact_zero_test,0,0},[],ok,0,<<>>},
         {testcase,{fact_test,fact_neg_test,0,0},[],ok,0,<<>>},
         {testcase,{fact_test,fact_pos_test,0,0},[],ok,0,<<>>}]}]

希望这有帮助。

相关问题