2010-06-26 2 views
4

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

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

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

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


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

ответ

1

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

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

0

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

2

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

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

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

Пока не полномасштабный каркас модульного тестирования с помощью какой-то мере, это помогает немного с ручным тестированием в моем случае.

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^