Python: Устройство тестирования сокета на базе кода?

StackOverflow https://stackoverflow.com/questions/4047897

Вопрос

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

Редактировать: Я не верю, что «наивный» насмешлиц будет достаточен для проверки компонентов SSL из-за сложных взаимодействий. Я ошибаюсь в этом? Или есть лучший способ проверить SSL'D вещи?

Это было полезно?

Решение

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

Например:

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 доступен как server_port атрибут.

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

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

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

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

Другие советы

Есть еще один (IMO лучше) Way: вы должны издеваться от библиотеки, которую вы используете. Пример подметающий помощник для Python мокс.

Вам не нужен набор серверов с действительным сертификатом, другим с неверным сертификатом, без поддержки SSL вообще не отвечает на любые пакеты вообще и т. Д. Вы можете моделировать свое поведение с помощью «манекенного» розетки клиента Отказ То, как он работает с Mox, вы сначала «учить» то, что следует ожидать, и как он должен отреагировать, а затем вы выполняете свой реальный код на нем, заменяя настоящий GEVENT.Socket для издевался. Это требует некоторой практики, чтобы получить это, но оно того стоит.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top