我正在使用Erlang和EUnit进行单元测试,我想编写一个测试运行器来自动运行单元测试。问题是eunit:test / 1似乎只返回“错误”或“确定”而不是测试列表以及他们返回的内容是通过还是失败。
那么有没有办法运行测试并返回某些形式的数据结构,包括测试运行的内容及其通过/失败状态?
答案 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 option和structured 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,<<>>}]}]
希望这有帮助。