Модульные розетки - PullRequest
       2

Модульные розетки

10 голосов
/ 28 декабря 2010

Привет Stackoverflowers,

У меня есть приложение, в котором существует уровень абстракции связи.Каждая реализация на этом уровне, называемая соединитель , предоставляет моему приложению способ обмена данными с подключенным одноранговым узлом (например, через HTTP, TCP-сокеты, UDP-сокеты и т. Д.).

Например, у меня есть класс Connector_Tcp, который реализует такие методы, как read , write , open и close .

Мне нужно написать модульный тест для этого класса.Я знаю, что модульные тесты должны иметь как можно меньше зависимостей.К сожалению, в этом случае зависимость - это системный ресурс: сокет;и я не могу обойти его.

Мне нужен совет о том, как проводить модульное тестирование этого класса.

По моему мнению, хотя этот класс использует системуресурс, он должен быть протестирован как и все остальные коннекторы , чтобы убедиться, что он соответствует стандарту, установленному моим приложением.

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

Я провел много модульных тестов в свое время, но ни одиниз которых зависит от такого низкоуровневого ресурса, который представляет собой сокеты.

Как бы вы провели модульное тестирование класса, зависящего от сокета?Открыть сокет для каждого устройства?Используйте один класс сервера, а затем вручную определенный ресурс сокета, чтобы подключиться к нему и проверить его ...?

Полагаю, моя проблема действительно заключается в следующем:

Если модульный тест не пройден ... как узнать, что:

  • Сокет уже используетсядругим процессом;
  • плохо написан модульный тест;или
  • Метод ведет себя некорректно (чего стоит модульный тест).

Мне нужен модульный тест для проверки, только если метод работает правильно илинет ...

Ответы [ 2 ]

5 голосов
/ 29 декабря 2010

Я написал аналогичный уровень абстракции, хотя и на C / C ++, и у меня была возможность провести модульное тестирование кода на основе сокетов. Я не знаю, есть ли здесь что-то специфическое для PHP, поэтому я просто предложу, какой общий совет я смогу.

  • Создайте сокет сервера в вашей настройке, закройте его. В зависимости от того, поддерживаете ли вы много клиентов, подключающихся к сокету сервера, вы можете выполнить эту часть в методе тестирования.
  • Предполагая, что вы можете указать порт для подключения в своем клиентском коде, привязать сокет сервера к порту 0 (временный порт), а затем использовать его в клиентском коде. Это устранит проблему привязки к порту, который уже используется.
  • Установите таймауты на ваших сокетах. Если ваш тест не пройден по какой-то неожиданной причине, вы не хотите, чтобы он зависал в ожидании подключения навсегда.
  • Вы должны иметь возможность чередовать поведение клиент / сервер. Например, вы захотите проверить, что произойдет, если сервер отключит свою сторону соединения на полпути через чтение / запись клиента. Либо асинхронный ввод-вывод, либо многопоточность выполнят эту работу. Я не уверен, что у вас есть в вашем распоряжении в PHP.
2 голосов
/ 29 декабря 2010

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

Например, вы могли бы написать один модульный тест, который велит экземпляру макета сокета генерировать исключение «порт недоступен». В этом случае вы можете утверждать, что ваш метод перехватил исключение и зарегистрировал его с тем же текстом, что и в исключении.

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

То есть вы на самом деле не тестируете сокет. Вы настраиваете сокет для имитации определенных случаев и тестируете, чтобы убедиться, что ваш код, работающий с сокетом, работает правильно.

(Я использовал фреймворки для имитации в Java, C #, Ruby и JavaScript. Я никогда не работал с PHP, но держу пари, что для этого есть несколько хороших фреймворков).

РЕДАКТИРОВАТЬ: Да, есть некоторые фреймворки для PHP. Я не могу рекомендовать один, но вот пару, которую я смог найти: PHPUnit и LastCraft

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...