Арматура распределенных тестов
У меня есть некоторые проблемы с распределенными тестами под арматурой. Арматура запускает узел с именем nonode@nohost
, После этого я вызываю функцию помощи make_distrib
которые предоставляют нормальное имя узла и начинают работу по распространению.
После запуска подчиненного узла я не смог отправить на него лямбду. У меня была ошибка:
= ОТЧЕТ ОБ ОШИБКАХ ==== 27-Jul-2013::22:48:02 === Ошибка в процессе на узле 'test1@just' со значением выхода: {{badfun, # Fun}, [{error_handler, undefined_lambda, 3, [{file, "error_handler.erl"}, {line, 64 }]}]}
Но! Если я запускаю тестирование простым способом - все работает хорошо:
$ Эрл 1> c(msg_proxy_tests). {Ок,msg_proxy_tests} 2> eunit:test({модуль, msg_proxy_tests},[подробный]). ======================== EUnit ======================== Модуль 'msg_proxy_tests'msg_proxy_tests: distrib_mode_test_ (тест режима распространения для узлов)... msg_proxy_tests.erl:14:<0.48.0>: node () = [test1@just] msg_proxy_tests.erl:15:<9999.39.0>: node () = test1@just msg_proxy_tests.erl:17:<0.48.0>: node () = [test1@just] [0,238 с] хорошо
Как я могу это исправить?
Источник модуля:
-модуль (msg_proxy_tests). -include_lib("eunit/ включить /eunit.hrl"). distrib_mode_test_()-> {"тест режима распространения для узлов", тайм-аут, 60, fun() -> {ok, Host} = inet:gethostname(), make_distrib("tests@"++Host, shortnames), slave: начало (Host, test1),?debugVal(node ()), spawn(list_to_atom("test1@"++Host), fun()->?debugVal(node ()) end), таймер:sleep(100),?debugVal(node ()), stop_distrib(), ok end}. -spec make_distrib( NodeName::string()|atom(), NodeType::shortnames | longnames) -> {ok, ActualNodeName::atom} | {ошибка, причина:: термин ()}. make_distrib(NodeName, NodeType) когда is_list(NodeName) -> make_distrib(erlang:list_to_atom(NodeName), NodeType); make_distrib(NodeName, NodeType) -> case case () из 'nonode@nohost' -> [] = os:cmd("epmd -daemon"), case net_kernel:start([NodeName, NodeType]) из {ok, _Pid} -> node() end; CurrNode -> конец CurrNode. stop_distrib()-> net_kernel:stop().
1 ответ
Это связано с тем, что хеш модуля на обоих узлах различен. Это происходит потому, что eunit компилирует код перед запуском и модуль содержит -ifdef(TEST)
макросы, которые определенно изменят свой хеш.
Вот почему анонимная функция #Fun<msg_proxy_tests.2.117197241
не удалось вызвать и произошла ошибка. (посмотрите на имя функции, и вы заметите забавные числа, это хеш модуля, он будет отличаться на обоих узлах).
Если вы хотите избежать этого, вы должны называть фанатов этим полным именем: module:fun_name/arity
,