从Erlang中的Eunit获取测试结果

从Erlang中的Eunit获取测试结果,erlang,eunit,Erlang,Eunit,我正在与Erlang和EUnit合作进行单元测试,我想编写一个测试运行程序来自动化单元测试的运行。问题是eunit:test/1似乎只返回“error”或“ok”,而不是一个测试列表,以及根据通过或失败的测试返回的内容 那么,有没有一种方法可以运行测试并返回某种形式的数据结构,即测试运行的内容及其通过/失败状态?如果您使用的是rebar,则不必实现自己的runner。您只需运行: rebar eunit 钢筋将编译并运行test目录中的所有测试(以及模块中的eunit测试)。此外,钢筋允许您在

我正在与Erlang和EUnit合作进行单元测试,我想编写一个测试运行程序来自动化单元测试的运行。问题是eunit:test/1似乎只返回“error”或“ok”,而不是一个测试列表,以及根据通过或失败的测试返回的内容


那么,有没有一种方法可以运行测试并返回某种形式的数据结构,即测试运行的内容及其通过/失败状态?

如果您使用的是rebar,则不必实现自己的runner。您只需运行:

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

{eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.
> eunit:test([foo], [verbose, {report,{eunit_surefire,[{dir,"."}]}}]).
您也可以在shell中使用这些选项:

{eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.
> eunit:test([foo], [verbose, {report,{eunit_surefire,[{dir,"."}]}}]).
另请参见和的文档


另一种选择是使用公共测试而不是Eunit。Common Test附带一个runner(
ct\u run
命令),使您的测试设置更加灵活,但使用起来也有点复杂。通用测试缺少可用的宏,但会生成非常容易理解的html报告。

没有简单的方法或文档化的方法,但目前有两种方法可以做到这一点。一种是在运行测试时提供“事件日志”选项:

eunit:test(my_module, [event_log])
(这是没有文档记录的,实际上只是为了调试)。生成的文件“eunit events.log”是一个文本文件,可由Erlang使用file:consult(文件名)读取

更强大的方法(并不是那么困难)是实现自定义事件侦听器,并将其作为eunit的一个选项:

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

这还没有被记录下来,但它应该被记录下来。侦听器模块实现eunit_侦听器行为(请参阅src/eunit_listener.erl)。只有五个回调函数需要实现。以src/eunit_tty.erl和src/eunit_surefire.erl为例。

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

用法示例:

> 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,<<>>}]}]
>eunit:test([fact_test],{report,{eunit_terms,[]}])。
3项测试全部通过。
好啊
>{ok,Ref}=dets:打开_文件(结果)。
{好的#Ref}
>详细信息:查找(参考,testsuite)。
[{testsuite、、8、、3、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,}]}]
希望这有帮助