Примеры использования 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.

Другие вопросы по тегам