我正在与Erlang和EUnit一起进行单元测试,我想编写一个测试运行器来自动运行单元测试.问题是eunit:test/1似乎只返回"错误"或"确定"而不是测试列表以及它们返回的内容是通过还是失败.
那么有没有办法运行测试并返回某些形式的测试运行的数据结构及其通过/失败状态?
如果您使用钢筋,则无需实施自己的跑步者.你可以简单地运行:
rebar eunit
Run Code Online (Sandbox Code Playgroud)
Rebar将编译并运行test目录中的所有测试(以及模块内的eunit测试).此外,rebar允许您rebar.config在shell中设置相同的选项:
{eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}.
Run Code Online (Sandbox Code Playgroud)
您也可以在shell中使用这些选项:
> eunit:test([foo], [verbose, {report,{eunit_surefire,[{dir,"."}]}}]).
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用Common Test而不是Eunit.Common Test附带一个跑步者(ct_run命令),为您的测试设置提供更大的灵活性,但使用起来也稍微复杂一些.Common Test缺乏可用的宏,但会生成非常易于理解的html报告.
没有简单或记录的方式,但目前有两种方法可以做到这一点.一种是在运行测试时给出选项'event_log':
eunit:test(my_module, [event_log])
Run Code Online (Sandbox Code Playgroud)
(这是未记录的,实际上只用于调试).生成的文件"eunit-events.log"是一个文本文件,可以由Erlang使用file:consult(Filename)读取.
更强大的方式(并不是真的那么困难)是实现自定义事件监听器并将其作为eunit的选项提供:
eunit:test(my_module, [{report, my_listener_module}])
Run Code Online (Sandbox Code Playgroud)
这还没有记录,但它应该是.侦听器模块实现eunit_listener行为(请参阅src/eunit_listener.erl).只有五个回调函数可以实现.查看src/eunit_tty.erl和src/eunit_surefire.erl以获取示例.