Эмуляция сетевых отключений для локального тестирования распределенных разделов приложений - PullRequest
5 голосов
/ 26 июня 2010

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

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

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

Но, может быть, существуют какие-то инструменты для этого, может быть, какая-то инфраструктура тестирования? В общем, как вы тестируете такие случаи в своих распределенных приложениях?


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

Ответы [ 4 ]

3 голосов
/ 29 июня 2010

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

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

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

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

1 голос
/ 26 июня 2010

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

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

0 голосов
/ 22 августа 2016

попробуйте блокаду.https://github.com/dcm-oss/blockade

Это инструмент, основанный на докере, для эмуляции желаемого поведения.Работает только на Linux, но для установки есть файл Vagrant, если вы хотите запустить его из другой ОС.

0 голосов
/ 26 июня 2010

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

...