Эмуляция сети разъединяется для локального тестирования разделения распределенного приложения

У меня есть несколько экземпляров распределенного приложения, работающего на localhost; каждый экземпляр общается с другими через определенные порты, все экземпляры вместе делают ансамбль. (Я на самом деле говорю о ZooKeeper, работая на Linux),

Теперь я хочу записать модульные тесты для эмуляции разделения ансамбля.
Например, у Меня есть 5 экземпляров, и я хочу разделить их на две группы 3 и 2 так, чтобы экземпляр от одной группы не мог связаться с экземпляром от другой группы. Это эмулировало бы реальную ситуацию, когда 3 машины находятся в одном центре обработки данных, 2 машины находятся в другом, и центры обработки данных становятся разделенными.

Проблема состоит в том, чтобы по существу заставить сокет работать выборочно: говорите с одним сокетом, но не говорите с другим. Одно решение, которое приходит на ум, состоит в том, чтобы абстрагировать коммуникационный слой и ввести правила тестирования в него (в форме, "если я - экземпляр от одной группы, мне не не разрешают говорить с экземпляром от другой группы - близко снабжают сокетом или игнорируют данные или безотносительно").

Но, возможно, там существуйте некоторые инструменты для этого, возможно, некоторая среда тестирования? В целом, как Вы тестируете такие случаи в своих распределенных приложениях?


P.S. Хотя вопрос отмечен с "Java" (так как ZooKeeper записан в Java), было бы замечательно услышать решения для любого другого языка или независимые от языка - возможно, некоторые приемы гуру Linux.

5
задан dorserg 26 June 2010 в 11:14
поделиться

3 ответа

У меня возникнет соблазн сказать, что это интеграционное тестирование, а не модульное тестирование (или что будет действительно сложно провести надлежащее модульное тестирование такой вещи).

Несколько раз мне нужно было протестировать такие вещи, я использовал виртуализацию (например,VMWare) для тестирования системы. Вы можете протестировать перезагрузку, выключение и т. Д. Узлов с одной физической машины, на которой запущено несколько образов.

1
ответ дан 15 December 2019 в 00:50
поделиться

Возможно, этот ответ сэкономит кому-то несколько часов поиска в Google.

В Linux есть очень хорошая служебная программа межсетевого экрана iptables . Он позволяет вам блокировать обмен данными между процессами, например:

iptables -A INPUT -p tcp --sport <source port> --dport <dest port> -j DROP

Хотя это и не является полноценной средой для модульного тестирования, в моем случае это немного помогает при ручном тестировании.

3
ответ дан 15 December 2019 в 00:50
поделиться

В прошлом я отключал сетевые кабели. Вы всегда можете отключить сетевой интерфейс через ОС.

0
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: