使用Eunit测试集群应用程序的示例

时间:2014-10-23 18:14:19

标签: unit-testing erlang distributed eunit

我发现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测试夹具的例子吗?

谢谢,

4 个答案:

答案 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