У меня есть несколько экземпляров распределенного приложения, работающего на localhost; каждый экземпляр общается с другими через определенные порты, все экземпляры вместе делают ансамбль. (Я на самом деле говорю о ZooKeeper, работая на Linux),
Теперь я хочу записать модульные тесты для эмуляции разделения ансамбля.
Например, у Меня есть 5 экземпляров, и я хочу разделить их на две группы 3 и 2 так, чтобы экземпляр от одной группы не мог связаться с экземпляром от другой группы. Это эмулировало бы реальную ситуацию, когда 3 машины находятся в одном центре обработки данных, 2 машины находятся в другом, и центры обработки данных становятся разделенными.
Проблема состоит в том, чтобы по существу заставить сокет работать выборочно: говорите с одним сокетом, но не говорите с другим. Одно решение, которое приходит на ум, состоит в том, чтобы абстрагировать коммуникационный слой и ввести правила тестирования в него (в форме, "если я - экземпляр от одной группы, мне не не разрешают говорить с экземпляром от другой группы - близко снабжают сокетом или игнорируют данные или безотносительно").
Но, возможно, там существуйте некоторые инструменты для этого, возможно, некоторая среда тестирования? В целом, как Вы тестируете такие случаи в своих распределенных приложениях?
P.S. Хотя вопрос отмечен с "Java" (так как ZooKeeper записан в Java), было бы замечательно услышать решения для любого другого языка или независимые от языка - возможно, некоторые приемы гуру Linux.
У меня возникнет соблазн сказать, что это интеграционное тестирование, а не модульное тестирование (или что будет действительно сложно провести надлежащее модульное тестирование такой вещи).
Несколько раз мне нужно было протестировать такие вещи, я использовал виртуализацию (например,VMWare) для тестирования системы. Вы можете протестировать перезагрузку, выключение и т. Д. Узлов с одной физической машины, на которой запущено несколько образов.
Возможно, этот ответ сэкономит кому-то несколько часов поиска в Google.
В Linux есть очень хорошая служебная программа межсетевого экрана iptables
. Он позволяет вам блокировать обмен данными между процессами, например:
iptables -A INPUT -p tcp --sport <source port> --dport <dest port> -j DROP
Хотя это и не является полноценной средой для модульного тестирования, в моем случае это немного помогает при ручном тестировании.
В прошлом я отключал сетевые кабели. Вы всегда можете отключить сетевой интерфейс через ОС.