Примеры использования Eunit для тестирования кластерного приложения
Мне не хватает документации по Eunit, касающейся того, как тестировать многоузловое приложение. Я нашел этот пример, но, к сожалению, когда я бегу:
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 здесь, но он вручную запускает несколько подчиненных узлов, а не использует встроенную функциональность Eunit.
Может кто-нибудь дать мне несколько примеров того, как использовать node
испытательный прибор?
Спасибо,
4 ответа
Хм, я никогда не заставлял функциональность подчиненного узла работать должным образом, поэтому она не должна быть документированной. Я предполагаю, что это закончилось в документах, в то время как я все еще думал, что это работало. Мне, вероятно, придется исправить документы.
Если вы работаете с многоузловыми тестами и имейте в виду, что eunit помнит, тогда eunit ifdefs в модулях изменит свои контрольные суммы, и если вы скажете, что один модуль скомпилирован с ifdef eunit, а другой - нет, у вас будут ошибки, если вы попытаетесь вызвать удаленные функции.
Я предлагаю вам запустить ваш главный узел с отключенным распространением. Включить с -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
}.
Обратите внимание, что аргумент функции теперь содержит не имя узла, а кортеж с двумя элементами. Первый элемент - это имя удаленного узла, второй - логический флаг, который всегда ложен (по крайней мере, на данный момент). Для более подробной информации обратитесь к источникам Eunit
Common Test был написан специально для тестирования больших систем.
Кроме официальной документации, вы можете найти очень хорошее введение в тему здесь. И даже глава заканчивается небольшим фрагментом, как интегрировать существующие тесты eunit в Common Test.