Python: модульное тестирование кода на основе сокетов?

Я пишу клиент Python+сервер, который использует gevent.socket для общения. Существуют ли хорошие способы тестирования работы кода на уровне сокета (например, проверка того, что SSL-соединения с недействительным сертификатом будут отклонены)? Или проще всего просто spawn реальный сервер?

редактировать: Я не считаю, что" наивная " насмешка будет достаточной для тестирования компонентов SSL из-за сложных взаимодействий. Я ошибаюсь? Или есть лучший способ проверить SSL-файлы?

3 ответов


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

например:

class SimpleServer(gevent.server.StreamServer):

    def handle(self, socket, address):
        socket.sendall('hello and goodbye!')

class Test(unittest.TestCase):      

    def test(self):
        server = SimpleServer(('127.0.0.1', 0))
        server.start()
        client = gevent.socket.create_connection(('127.0.0.1', server.server_port))
        response = client.makefile().read()
        assert response == 'hello and goodbye!'
        server.stop()

используя 0 порт значение означает, что сервер будет использовать любой доступный порт. После запуска сервера фактическое значение, выбранное bind доступно .

StreamServer поддерживает SSL тоже, pass keyfile и certfile аргументы конструктору, и он обернет каждый сокет с SSLObject прежде чем передать его в обработчик.

если вы не используете StreamServer и ваш сервер на основе Гринлет тогда действительно нерестовые это то, что вы должны сделать. Не забудьте убить это в конце теста.

запуск сервера и нерест greenlet являются быстрыми операциями в gevent, намного быстрее, чем создание нового потока или процесс и вы можете легко создать новый сервер для каждого теста. Просто не забудьте очистить, как только вам больше не нужен сервер.

Я считаю, что нет необходимости издеваться над любым gevent API, гораздо проще просто использовать его, поскольку серверы и клиенты могут счастливо жить в одном и том же процессе.


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

вам не нужен набор серверов с действительным сертификатом, другой с недействительным сертификатом, без поддержки ssl вообще, не отвечающих на какие-либо пакеты вообще и т. д. Вы можете имитировать их поведение с помощью "фиктивного" клиентского сокета. Как это работает с Mox, вы сначала "учите", что он должен ожидать и как это должен реагировать, а затем вы выполняете свой реальный код на нем при замене реального gevent.розетка для насмешливого. Это требует некоторой практики, чтобы освоиться, но оно того стоит.


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

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