繁体   English   中英

钢筋分布式测试

[英]Rebar distributed tests

我在钢筋下进行分布式测试时遇到一些问题。 钢筋以名称nonode@nohost开头节点。 之后,我调用帮助函数make_distrib ,该函数提供正常的节点名称并开始分发工作。
启动从属节点后,我无法向其发送任何lambda。 我有错误:

=ERROR REPORT==== 27-Jul-2013::22:48:02 ===
    Error in process  on node 'test1@just' with exit value: {{badfun,#Fun<msg_proxy_tests.2.117197241>},[{error_handler,undefined_lambda,3,[{file,"error_handler.erl"},{line,64}]}]}

但! 如果我以简单的方式进行测试-一切正常:

$erl
    1> c(msg_proxy_tests).
    {ok,msg_proxy_tests}
    2> eunit:test({module, msg_proxy_tests},[verbose]).
    ======================== EUnit ========================
    module 'msg_proxy_tests'msg_proxy_tests: distrib_mode_test_ (distribute mode test for nodes)...
    msg_proxy_tests.erl:14:<0.48.0>: nodes ( ) = [test1@just]
    msg_proxy_tests.erl:15:<9999.39.0>: node ( ) = test1@just
    msg_proxy_tests.erl:17:<0.48.0>: nodes ( ) = [test1@just]
    [0.238 s] ok

我怎样才能解决这个问题?


模块来源:

\n\n     -module(msg_proxy_tests)。\n\n     -include_lib(“ eunit / include / eunit.hrl”)。\n\n     distrib_mode_test _()->\n     {“节点的分布式模式测试”,超时,60, \n         fun()->\n             {ok,主机} = inet:gethostname(),\n             make_distrib(“ tests @” ++主机,简称),\n             slave:start(主机,test1),\n             ?debugVal(nodes()),\n             spawn(list_to_atom(“ test1 @” ++ Host),fun()->?debugVal(node())结束),\n             计时器:睡眠(100), \n             ?debugVal(nodes()),\n             stop_distrib(),\n             \n         结束}。\n\n     -spec make_distrib(NodeName :: string()| atom(),NodeType :: shortnames | longnames)->\n         {ok,ActualNodeName :: atom} |  {错误,原因:: term()}。\n     当is_list(NodeName)-> make_distrib(NodeName,NodeType)\n         make_distrib(erlang:list_to_atom(NodeName),NodeType);\n     make_distrib(NodeName,NodeType)->\n         的case node()\n             'nonode @ nohost'-> \n                 [] = os:cmd(“ epmd -daemon”),\n                 net_kernel:start([NodeName,NodeType])的情况 \n                     {ok,_Pid}-> node() \n                 结束;\n             CurrNode-> CurrNode\n         结束。\n\n     stop_distrib()->\n         net_kernel:stop()。\n\n

这是因为两个节点上的模块哈希不同。 发生这种情况是因为eunit在运行之前会编译代码,并且模块包含-ifdef(TEST)宏,这肯定会更改其哈希值。

这就是为什么无法调用匿名函数#Fun<msg_proxy_tests.2.117197241并发生错误的原因。 (查看函数名称,您会注意到有趣的数字,这是模块哈希,在两个节点上都不同)。

如果要避免这种情况,则应使用完全限定的名称来调用module:fun_name/aritymodule:fun_name/arity

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM