Как выполнить юнит-тест цикла событий? - PullRequest
1 голос
/ 03 октября 2010

Я программирую HTTP-прокси на Python (прозрачный прокси для мониторинга запросов / ответов).Но, как сторонник TDD, я начинаю проект с HTTP-входов, которые должны быть перехвачены TCP-сервером.Но, как и любой сервер, он должен работать в цикле событий, чтобы он мог прослушивать определенный порт.

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

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

Спасибо!

Диого

Ответы [ 4 ]

1 голос
/ 04 октября 2010

Сам цикл не должен охватываться TDD.Вы можете протестировать в основном все остальное, и, учитывая, что код внутри цикла должным образом изолирован, вы можете быть уверены в своем коде.

То есть, если ваш цикл сокращен до простого

while keep_serving:
    keep_serving = handle_events(...)

вы можете протестировать handle_events и его компоненты, а сам цикл тривиален.

Кроме того, вы столкнетесь с необходимостью проверки соединений, розеток и т. Д. Я рекомендую отличный Mocker *Модуль 1009 *, автор Густаво Нимейер.Это очень удобно (если нетривиально полностью понять с первого взгляда).

1 голос
/ 03 октября 2010

Вы должны рефакторировать то, что слушает ваш цикл, чтобы вы могли заменить это на фальшивку или макет. Если этот объект не является производным от интерфейса, вам, возможно, придется написать объект-оболочку, который вы можете подделать или смоделировать.

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

0 голосов
/ 03 октября 2010

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

Тогда каждый модульный тест будет выглядеть примерно так:

  1. Регистрация прослушивателя сокета тестового сервера
  2. Регистрация разъема сокета тестового клиента
  3. Запуск цикла событий, ожидающего завершения взаимодействия (или тайм-аута)
  4. Обрабатывать / сообщать о результатах теста

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

0 голосов
/ 03 октября 2010

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

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