我发现Eunit上的documentation缺少关于如何测试多节点应用程序的问题。我发现了这个example,但遗憾的是我跑了:
cluster_test_() ->
{node, foo,
fun (Node) ->
[?_assertEqual(pong, net_adm:ping(Node))]
end
}.
我明白了:
undefined
*** context setup failed ***
** in function slave:start/5 (slave.erl, line 197)
**exit:not_alive
我在这里做错了吗?
作为旁注,我还查看了gproc的分布式测试here,但它manually starting了许多从属节点,而不是使用内置的Eunit功能。
有人可以给我一些如何使用node
测试夹具的例子吗?
谢谢,
答案 0 :(得分:0)
Common Test专门用于测试更大的系统。
其他官方文档,您可以找到对主题here的非常好的介绍。章节以small snippet结尾,如何将现有的eunit测试集成到Common Test中。
答案 1 :(得分:0)
嗯,我从来没有让从节点功能正常工作,所以它不应该是一个记录的功能。我猜它最终出现在文档中,而我仍然认为它有效。我可能要修复文档。
答案 2 :(得分:0)
如果您要进行多节点测试并且eunit请记住,那么模块中的eunit ifdef将更改它的校验和,如果您说有一个模块使用ifdef eunit编译而另一个模块不是,那么您将遇到错误如果尝试调用远程函数。
答案 3 :(得分:0)
我的建议是运行具有禁用分发的主节点。使用-sname
密钥启用它(我假设您的示例代码位于模块node_test
中):
> erl -sname master
(master@hostname)1> c(node_test).
> node_test:test().
但并非全部。要在新版本的erlang中运行此代码,您应该进行一些更改:
cluster_test_() ->
{node, foo,
fun ({Node, StopNet}) ->
?debugFmt("Node ~p", [Node]),
?debugFmt("StopNet ~p", [StopNet]),
[?_assertEqual(pong, net_adm:ping(Node))]
end
}.
注意,函数参数现在不包含节点名,而是包含两个元素的元组。第一个元素是远程节点名称,第二个是布尔标志,它始终为false(至少目前为止)。有关更多详细信息,请参阅eunit sources